##查看代碼:https://gitee.com/jly521/proxy.gitjava
代理模式(Proxy)git
- 應用場景:爲其餘對象提供一種代理以控制對這個對象的訪問
- 從結構上來看和Decorator 模式相似,
- 但Proxy 是控制,更像是一種對功能的限制,而Decorator 是增長職責
- Spring 的Proxy 模式在AOP 中有體現,好比JdkDynamicAopProxy 和Cglib2AopProxy(就是 JDK動態代理和 CGLIB 動態代理)
靜態代理::3d
- 就是把被代理對象包起來,任何人要訪問被代理對象,就來找我,我是全權代理
動態代理::代理
本身動手實現一個 動態代理::對象
調用方法:blog
- 傳入被具體的代理類(返回結果是被代理類實現的接口)
CustomMeipo 具體實現繼承
- 繼承 GPInvocationHandler 調用鉤子接口
- 把引用保存起來
- 生成實例
- 注意,此處的實例實際上是被代理類的封裝子類,從實現原理中咱們會知道該子類是動態生成的
- 傳入參數 GPInvocationHandler 是調用鉤子(本類繼承了該接口,鉤子能夠傳本身)
基本原理:接口
- 具體實現有:類 GPProxy、GPInvocationHandler 接口、GPClassLoader 類
GPInvocationHandler 接口ip
- 回調鉤子接口
- 提供方法調取鉤子方法,用於客戶加強方法功能
GPClassLoader::get
- GPClassLoader 繼承 ClassLoader
- 用於編譯生成的臨時文件 $Proxy0.java 得到$Proxy0.class,加載到JVM中來
GPProxy::
- 主實現類,生成一個新的實例,即被實現類的 加強實例(生成的這個類很像靜態代理類,不過此處是動態生成的)
- 動態生成源代碼.java文件 $Proxy0.java(在GPProxy 相同目錄下)
- Java文件輸出磁盤
- 把生成的.java文件編譯成.class文件(刪除.java文件)
- 編譯生成的.class文件加載到JVM中來
- 返回字節碼重組之後的新的代理對象(傳入回調鉤子)