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方法裏面想作什麼都行。java
Proxy.newInstance返回的對象實現了TargetIntf接口的方法,因此能夠強轉。編程
Proxy.newInstance返回的對象組合了handler,並在method1方法的實現邏輯中添加了handler.invoke的調用。api
動態的生成class文件,java類的信息都是從class文件加載進來的,Proxy.newInstance方法中動態的生成了class文件並加載。網絡
試想一下,若是沒有動態代理,dubbo框架如何實現?框架
動態代理的dubbo實現:ide
沒有動態代理的實現:工具
有了動態代理,dubbo rpc中的網絡交互部分能夠徹底寫在dubbo框架中,對用戶來講編程更加方便。
沒有動態代理,client端的api實現代碼也能夠經過工具自動生成,不過這樣讓框架使用起來更加的複雜。代理