从JDK或Cglib代理中得到目标对象
看到这个,觉得很有用,
有一个应用场景是:dorado7 中
它的前端向后端传数据用的就是Cglib代理,如果用它的全部框架,它后端用hibernate 去保存就会很好,因hibernate 也是用Cglib代理,但我的自已的程序里面是对Spring的JDBC作了一个封装,所以从前台传到后台后还是一个代理,在保存时就会有错误,所以要得到目标对象,用以下方法即可得到。
?
?
代码如下:
import java.lang.reflect.Field;import org.springframework.aop.framework.AdvisedSupport;import org.springframework.aop.framework.AopProxy;import org.springframework.aop.support.AopUtils;public class AopTargetUtils {/** * 获取 目标对象 * @param proxy 代理对象 * @return * @throws Exception */public static Object getTarget(Object proxy) throws Exception { if(!AopUtils.isAopProxy(proxy)) {return proxy;//不是代理对象}if(AopUtils.isJdkDynamicProxy(proxy)) {return getJdkDynamicProxyTargetObject(proxy);} else { //cglibreturn getCglibProxyTargetObject(proxy);} }private static Object getCglibProxyTargetObject(Object proxy) throws Exception {Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); h.setAccessible(true); Object dynamicAdvisedInterceptor = h.get(proxy); Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); advised.setAccessible(true); Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget(); return target;}private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {Field h = proxy.getClass().getSuperclass().getDeclaredField("h"); h.setAccessible(true); AopProxy aopProxy = (AopProxy) h.get(proxy); Field advised = aopProxy.getClass().getDeclaredField("advised"); advised.setAccessible(true); Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget(); return target;}}?
源自:http://jinnianshilongnian.iteye.com/blog/1613222
?