前一篇文章,稍微講解了一下靜態代理的原理,分爲三部曲
第一步是定義一個共同使用的接口供目標類和代理類使用
第二步是代理類和目標類同時實現該接口,並且,代理類的實現類中需要有目標類的引用
第三步創建真實類對象和代理類對象,同時將真實類的引用傳給代理類對象,調用代理類的方法,執行目標類的業務
相比於靜態代理,這種在開始就已經定義好了代理類,動態代理的區別就是代理類對象的定義是有jmv動態生成的,jdk的動態代理藉助InvocationHandle接口和Proxy類共同完成。
1.java.lang.reflect.Proxy:是jdk動態代理的主類
2.java.lang.reflect.InvocationHandler:是一個調用處理器,需要我們自定義其invoke方法,用於實現對於真實委託類的代理訪問
jdk動態代理創建對象的過程步驟如下:
1.實現IncocationHandle接口創建自己的調用處理器,(調用處理器中需要引入目標類的實例)
InvocationHandler handler = new InvocationHandlerImpl(T target);
2.通過Proxy對象指定類裝載器和一組interface接口,創建代理類
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... });
3.通過反射機制獲取動態代理類的構造方法,其參數是一個代用處理器類型的接口
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class });
4.通過以上構造函數動態創建動態代理類的實例,構造是傳入調用處理器作爲唯一入參
以上是jdk動態代理標準的實現過程,作爲簡化,Proxy類中提供了另外一個方法newProxyInstance,相當於是封裝了2,3,4步
因此,只需兩步就能完成動態代理的對象的創建
1.InvocationHandler handler = new InvocationHandlerImpl(..);
2.// 通過 Proxy 直接創建動態代理類實例
Interface proxy = (Interface)Proxy.newProxyInstance( classLoader,
new Class[] { Interface.class },
handler );