码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-12 14:01:06      阅读:216      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!