動態代理

java代理有jdk動態代理、cglib代理,這裏只說下jdk動態代理,jdk動態代理主要使用的是java反射機制(既java.lang.reflect包),動態代理使用前提:必須有接口

 

1、動態代理的作用(運行時實現指定的接口)

動態代理就是在運行時生成一個類,這個類會實現你指定的一組接口,而這個類沒有.java文件,是在運行時生成的。

2、動態代理的使用方法

Class[] cs = {MyInterface.class};

MyInterface mi = (MyInterface)Proxy.newProxyInstance(loader, cs, h);

mi是cs的實現類

 

動態代理:程序運行時,使用JDK提供工具類(Proxy),動態創建一個類,此類一般用於代理。

代理:你 -- 代理(增強) -- 廠商

代理類:目標類:被代理的

 

目標對象:被增強的對象

代理對象:需要目標對象,然後在目標對象上添加了增強後的對象!

目標方法:增強的內容

 

代理對象 = 目標對象 + 增強

 

Object proxyObj = Proxy.newProxyInstance(參數1,參數2,參數3);

參數1:ClassLoader,類加載器!把.class文件加載到內存,形成Class對象!當前類.class.getClassLoader();

參數2:Class[] interfaces ,代理類需要實現的所有接口(確定方法),被代理類實例.getClass().getInterfaces();

參數3:InvocationHandler, 請求處理類,代理類不具有任何功能,代理類的每一個方法執行時,調用處理類invoke方法。

代理對象的所有方法(個別不執行,getClass())都會調用InvocationHandler的invoke()方法。

voke(Object proxy ,Method ,Object[] args)

                  參數1:當前對象,即代理對象!在調用誰的方法!

                  參數2:當前被調用的方法(目標方法)

                  參數3:方法實際參數。

 

 

3、動態代理的用途

動態代理的用途與裝飾模式很相似,就是爲了對某個對象進行增強。所有使用裝飾者模式的案例都可以使用動態代理來替換。

 

4、常見問題

(1)這個invoke()方法在什麼時候被調用!

     在代理對象被創建時?錯誤的!

     在調用代理對象所實現接口中的方法時?正確的!

 

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