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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试相关的知识,希望对你有一定的参考价值。

/** 
* 获取 目标对象 
* @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 代理对象的真实实例,可以反射私有方法,便于测试的主要内容,如果未能解决你的问题,请参考以下文章

代理反射注解hook

Spring aop TargetSource

java基础-常见面试题

python反射

反射机制-动态代理

Java基础之反射注解代理