dubbo源码之动态代理模式生成proxy过程
2018-01-29 17:18
387 查看
跟踪消费方创建代理对象的过程在ReferenceConfig中实现
//在init方法中创建代理对象,init在工厂方法FactoryBean的getObject()中调用 ref = createProxy(map);
/** * 在createProxy(Map<String, String> map) 方法最后一行根据生成的invoker对象生成代理对象,根据dubbo特有的spi自适应扩展机制 proxyFactory = * ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension()默认 * 使用javassist动态字节码生生代理类 */ (T) proxyFactory.getProxy(invoker);
/** * 最终生成的代理对象代码如下,实际上存储了消费接口的所有方法和invocationHander对象,重写消费接口所有方法为调用handler的invoke方法;VersionService是版本测试代码中的消费接口,EchoService是默认增加的展示接口, */ public class proxy0 implements DC, EchoService, VersionService { public static Method[] methods; private InvocationHandler handler; //VersionService 中的sayHello方法 public String sayHello(String var1) { Object[] var2 = new Object[]{var1}; Object var3 = this.handler.invoke(this, methods[0], var2); return (String)var3; } public String autoLearn(String var1) { Object[] var2 = new Object[]{var1}; Object var3 = this.handler.invoke(this, methods[1], var2); return (String)var3; } public Object $echo(Object var1) { Object[] var2 = new Object[]{var1}; Object var3 = this.handler.invoke(this, methods[2], var2); return (Object)var3; } public proxy0() { } public proxy0(InvocationHandler var1) { this.handler = var1; } }
//所有代理对象的handler均为InvokerInvocationHandler,invoke代码如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); Class<?>[] parameterTypes = method.getParameterTypes(); if (method.getDeclaringClass() == Object.class) { return method.invoke(invoker, args); } if ("toString".equals(methodName) && parameterTypes.length == 0) { return invoker.toString(); } if ("hashCode".equals(methodName) && parameterTypes.length == 0) { return invoker.hashCode(); } if ("equals".equals(methodName) && parameterTypes.length == 1) { return invoker.equals(args[0]); } return invoker.invoke(new RpcInvocation(method, args)).recreate();
相关文章推荐
- dubbo源码之动态代理模式生成Invoker过程
- spring框架Proxy-代理模式(动态生成代理对象)
- Java设计模式-代理模式之动态代理(附源码分析)
- 如何使用Proxy模式及Java内建的动态代理机制 推荐
- Java设计模式Proxy之动态代理
- 使用反射生成JDK动态代理---使用Proxy和InvocationHandler创建动态代理
- [jvm解析系列][十四]动态代理和装饰模式,带你看源码深入理解装饰模式和动态代理的区别。
- 如何使用Proxy模式及Java内建的动态代理机制
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
- 【设计模式】动态代理Proxy_01
- jdk动态代理生成代理对象源码分析-4
- Java动态代理的源码分析;Proxy与InvocationHandler
- JAVA 动态代理(proxy)的实现和源码分析
- Design Pattern—— Dynamic Proxy Pattern(三) 动态代理模式
- 结构型模式之代理模式(Proxy 与 JDK动态代理)
- Proxy 代理模式 动态代理 CGLIB
- 【设计模式】动态代理Proxy_02
- JAVA动态代理模式源码解析
- Java设计模式Proxy之动态代理
- 设计模式学习——动态代理实现C#动态调用WebService(附源码)