这里使用的代理是dubbo默认javassist动态代理
private Object getTargetClass(Object invoker) throws Exception {
Field invokerField = invoker.getClass().getDeclaredField("invoker");
invokerField.setAccessible(true);
// 此时javassistProxyFactoryInvoker是JavassistProxyFactory内部方法getInvoker返回的AbstractProxyInvoker匿名实现类
AbstractProxyInvoker javassistProxyFactoryInvoker = (AbstractProxyInvoker)invokerField.get(invoker);
/**
** javassistProxyFactoryInvoker.getClass() 是AbstractProxyInvoker匿名实现类的运行实例
** javassistProxyFactoryInvoker.getClass().getSuperclass() 是 AbstractProxyInvoker 实例
*/
Field proxy = javassistProxyFactoryInvoker.getClass().getSuperclass().getDeclaredField("proxy");
proxy.setAccessible(true);
// proxyValue即是实现类(如BActServiceImpl实例)
Object proxyValue = proxy.get(javassistProxyFactoryInvoker);
/**
** proxyValue.getClass().getSuperclass()是java.lang.reflect.Proxy 实例
**/
Field jdkDynamicAopProxy = proxyValue.getClass().getSuperclass().getDeclaredField("h");
jdkDynamicAopProxy.setAccessible(true);
Object jdkDynamicAopProxyValue = jdkDynamicAopProxy.get(proxyValue);
Field advised = jdkDynamicAopProxyValue.getClass().getDeclaredField("advised");
advised.setAccessible(true);
return ((AdvisedSupport)advised.get(jdkDynamicAopProxyValue)).getTargetSource().getTarget();
}
参考debug图如下: