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