(转载,但不知道谁原创)获取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; 
}

 

posted @ 2016-09-12 12:00  181282945  阅读(3921)  评论(0编辑  收藏