public class TargetClass{ void method1() } public class ProxyClass{ private TargetClass target; public void method1(){ target.method1() } }
public interface TargetIntf{ void method1(); } public DynamicProxy implements InvocationHandler{ @Override public Object invoke(Object o, Method method, Object[] args){ //do proxy } } InvocationHandler handler = new DynamicProxy(); Proxy theProxy = (TargetIntf)Proxy.newInstance(hander.getClass().getClassLoader(), new Class[]{TargetIntf.class}, handler); theProxy.method1()
当调用theProxy的method1时,会触发handler.invoke方法的调用,方法(Method)和参数都会传递给invoke方法,invoke方法里面想做什么都行。
Proxy.newInstance返回的对象实现了TargetIntf接口的方法,所以可以强转。
Proxy.newInstance返回的对象组合了handler,并在method1方法的实现逻辑中添加了handler.invoke的调用。
动态的生成class文件,java类的信息都是从class文件加载进来的,Proxy.newInstance方法中动态的生成了class文件并加载。
试想一下,如果没有动态代理,dubbo框架如何实现?
动态代理的dubbo实现:
没有动态代理的实现:
有了动态代理,dubbo rpc中的网络交互部分可以完全写在dubbo框架中,对用户来说编程更加方便。
没有动态代理,client端的api实现代码也可以通过工具自动生成,不过这样让框架使用起来更加的复杂。