設(shè)計模式之代理模式
10分鐘看懂動態(tài)代理設(shè)計模式(升級篇)-對這篇動態(tài)代理模式的思路整理
仿JDK實(shí)現(xiàn)動態(tài)代理邏輯
通過一步步實(shí)現(xiàn)一個簡易的仿JDK實(shí)現(xiàn)動態(tài)代理邏輯
第1步:通過動態(tài)代理方式模擬實(shí)現(xiàn)靜態(tài)代理效果
- 通過JavaPoet生成靜態(tài)代理類TimeProxy源代碼
- 通過JDK編譯TimeProxy源代碼
- 通過類加載器把TimeProxy字節(jié)碼文件轉(zhuǎn)換為內(nèi)存中TimeProxy字節(jié)碼對象
- 通過反射機(jī)制把創(chuàng)建代理對象
通過第1步實(shí)現(xiàn)了:
- 不再需要手動創(chuàng)建TimeProxy類java代碼(站在邁向一個完整的動態(tài)代理的角度)
- 可以代理任意實(shí)現(xiàn)了Flyable接口的類對象吻氧,并獲取接口方法的執(zhí)行時間
產(chǎn)生的問題:
- 只是針對實(shí)現(xiàn)了Flyable接口的類對象,并不是任意對象
第2步:接口類型作為參數(shù)傳入叫确,而不是寫死
通過第2步實(shí)現(xiàn)了:
- 可以針對實(shí)現(xiàn)傳入接口的任意對象
產(chǎn)生的問題:
- 只能代理特定的功能判耕,缺少靈活性移国,在這里是只能用于獲取方法的執(zhí)行時間
- 如果要增加其它代理功能蛤育,例如在委托方法執(zhí)行前后打印日志則需要重新創(chuàng)建一個代理類,顯然這是不妥的
第3步:新增InvocationHandler接口扶檐,用于處理自定義邏輯
開發(fā)者需要對代理類進(jìn)行自定義處理時凶杖,只要實(shí)現(xiàn)該接口,并在invoke方法中進(jìn)行相應(yīng)的處理即可
第4步:修改生成代理對象代碼
為此款筑,我們需要在原Proxy.newProxyInstance()方法中做如下改動:
- 在newProxyInstance方法中傳入InvocationHandler
- 在生成的代理類中增加成員變量handler
- 在生成的代理類方法中智蝠,調(diào)用invoke方法
總結(jié)
- Proxy->newProxyInstance用于生成代理對象
- InvocationHandler:這個接口主要用于自定義代理邏輯處理
- 為了完成對被代理對象的方法攔截腾么,我們需要在InvocationHandler對象中傳入被代理對象實(shí)例。