dubbo源码:获取dubbo Filter中invoker的目标方法

这里使用的代理是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图如下:
dubbo源码:获取dubbo Filter中invoker的目标方法