設計模式之代理模式

設計模式之代理模式

10分鐘看懂動態(tài)代理設計模式(升級篇)-對這篇動態(tài)代理模式的思路整理

仿JDK實現(xiàn)動態(tài)代理邏輯

通過一步步實現(xiàn)一個簡易的仿JDK實現(xiàn)動態(tài)代理邏輯

第1步:通過動態(tài)代理方式模擬實現(xiàn)靜態(tài)代理效果
  1. 通過JavaPoet生成靜態(tài)代理類TimeProxy源代碼
  2. 通過JDK編譯TimeProxy源代碼
  3. 通過類加載器把TimeProxy字節(jié)碼文件轉換為內存中TimeProxy字節(jié)碼對象
  4. 通過反射機制把創(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對象中傳入被代理對象實例。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容