咕泡-代理 proxy 設計模式筆記

##查看代碼:https://gitee.com/jly521/proxy.gitjava

代理模式(Proxy)git

  • 應用場景:爲其餘對象提供一種代理以控制對這個對象的訪問
    • 從結構上來看和Decorator 模式相似,
    • 但Proxy 是控制,更像是一種對功能的限制,而Decorator 是增長職責
  • Spring 的Proxy 模式在AOP 中有體現,好比JdkDynamicAopProxy 和Cglib2AopProxy(就是 JDK動態代理和 CGLIB 動態代理)

  • 靜態代理和動態代理

靜態代理::3d

  • 就是把被代理對象包起來,任何人要訪問被代理對象,就來找我,我是全權代理

動態代理::代理

  • jdk 動態代理 和 cglib 動態代理

本身動手實現一個 動態代理::對象

調用方法:blog

  • 傳入被具體的代理類(返回結果是被代理類實現的接口)

CustomMeipo 具體實現繼承

  • 繼承 GPInvocationHandler 調用鉤子接口
  • 把引用保存起來

  • 生成實例
    • 注意,此處的實例實際上是被代理類的封裝子類,從實現原理中咱們會知道該子類是動態生成的
  • 傳入參數 GPInvocationHandler 是調用鉤子(本類繼承了該接口,鉤子能夠傳本身)

  • 實現 鉤子接口方法,加強被代理類的方法實現

基本原理:接口

  • 具體實現有:類 GPProxy、GPInvocationHandler 接口、GPClassLoader 類

GPInvocationHandler 接口ip

  • 回調鉤子接口
  • 提供方法調取鉤子方法,用於客戶加強方法功能

GPClassLoader::get

  • GPClassLoader 繼承 ClassLoader 
  • 用於編譯生成的臨時文件 $Proxy0.java 得到$Proxy0.class,加載到JVM中來

GPProxy::

  • 主實現類,生成一個新的實例,即被實現類的 加強實例(生成的這個類很像靜態代理類,不過此處是動態生成的)
    1. 動態生成源代碼.java文件 $Proxy0.java(在GPProxy 相同目錄下)
    2. Java文件輸出磁盤
    3. 把生成的.java文件編譯成.class文件(刪除.java文件)
    4. 編譯生成的.class文件加載到JVM中來
    5. 返回字節碼重組之後的新的代理對象(傳入回調鉤子)

相關文章
相關標籤/搜索