读书人

从JDK或Cglib署理中得到目标对象

发布时间: 2012-12-18 12:43:41 作者: rapoo

从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

?

读书人网 >编程

热点推荐