JDK動態代理粗解

前一篇文章,稍微講解了一下靜態代理的原理,分爲三部曲

  第一步是定義一個共同使用的接口供目標類和代理類使用

  第二步是代理類和目標類同時實現該接口,並且,代理類的實現類中需要有目標類的引用

  第三步創建真實類對象和代理類對象,同時將真實類的引用傳給代理類對象,調用代理類的方法,執行目標類的業務

相比於靜態代理,這種在開始就已經定義好了代理類,動態代理的區別就是代理類對象的定義是有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 );
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章