dubbo源码:获取dubbo Filter中invoker的目标方法
Posted 方辰的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
}
以上是关于dubbo源码:获取dubbo Filter中invoker的目标方法的主要内容,如果未能解决你的问题,请参考以下文章
dubbo源码阅读-Filter默认实现之CacheFiler