java靜態代理與動態代理

       代理模式是java常見的設計模式。其目的是爲其餘對象提供一個代理以控制對某個真實對象的訪問。經過代理類這一中間層,有效控制對真實委託類的對象的直接訪問,同時能夠實現自定義的控制策略。 根據代理類的建立的時間點,又能夠分爲靜態代理和動態代理。java

        1.靜態代理:編譯時生成代理,也稱編譯時加強。設計模式

        2.動態代理:運行時生成代理,也成爲運行時加強。函數

 動態代理:動態代理有兩種常見實現方式。設計

  a.cglib動態代理。代理的是類,不須要實現接口。經過派生類的子類來實現代理。經過在運行時,動態修改字節碼達到修改類的目的。代理

  b.jdk動態代理。實現類InvocationHandler接口的invoker方法,可是注意代理的是接口。也就是說業務類必需要實現接口,經過Proxy裏的newProxyInstance獲得代理對象。code

      在java.lang.reflect包中,提供一個Proxy類和InvocationHandler接口,經過這個類和接口能夠生成JDK的動態代理。對象

1,經過實現 InvocationHandler 接口建立本身的調用處理器接口

InvocationHandlerImpl 實現了 InvocationHandler 接口,並能實現方法調用從代理類到委託類的分派轉發
InvocationHandler handler = new InvocationHandlerImpl(..);

2,經過爲 Proxy 類指定 ClassLoader 對象和一組 interface 來建立動態代理類;get

// 經過 Proxy 爲包括 Interface 接口在內的一組接口動態建立代理類的類對象
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... });

3,經過反射機制得到動態代理類的構造函數,其惟一參數類型是調用處理器接口類型;io

// 經過反射從生成的類對象得到構造函數對象
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class });

4,經過構造函數建立動態代理類實例,構造時調用處理器對象做爲參數被傳入。

// 經過構造函數對象建立動態代理類實例
Interface Proxy = (Interface)constructor.newInstance(new Object[] { handler });

爲了簡化對象建立過程,Proxy類中的newProxyInstance封裝了2-4步驟,只需兩步便可完成代理對象的建立。

// 經過 Proxy 直接建立動態代理類實例
Interface proxy = (Interface)Proxy.newProxyInstance( classLoader, 
     new Class[] { Interface.class }, 
     handler );
相關文章
相關標籤/搜索