首页 > 编程语言 > 详细

获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试

时间:2016-09-12 13:57:54      阅读:518      评论:0      收藏:0      [点我收藏+]
/** 
* 获取 目标对象 
* @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 { //cglib 
return 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; 
}

 

获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试

原文:http://www.cnblogs.com/sweetchildomine/p/5864296.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!