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()方法在什麼時候被調用!
在代理對象被創建時?錯誤的!
在調用代理對象所實現接口中的方法時?正確的!