動態代理的原理java
javasist——>方式 框架
1. 獲取 RealSubject上的全部接口列表;
2. 肯定要生成的代理類的類名,默認爲:com.sun.proxy.$ProxyXXXX ;ui
3. 根據須要實現的接口信息,在代碼中動態建立 該Proxy類的字節碼;lua
4 . 將對應的字節碼轉換爲對應的class 對象;.net
5. 建立InvocationHandler 實例handler,用來處理Proxy全部方法調用;代理
6. Proxy 的class對象 以建立的handler對象爲參數,實例化一個proxy對象對象
cglib 建立某個類A的動態代理類的模式是:blog
1. 查找A上的全部非final 的public類型的方法定義;接口
2. 將這些方法的定義轉換成字節碼;文檔
3. 將組成的字節碼轉換成相應的代理的class對象;
4. 實現 MethodInterceptor接口,用來處理 對代理類上全部方法的請求(這個接口和JDK動態代理InvocationHandler的功能和角色是同樣的)
Java字節碼生成開源框架介紹--ASM:
ASM 是一個 Java 字節碼操控框架。它可以以二進制形式修改已有類或者動態生成類。ASM 能夠直接產生二進制 class 文件,也能夠在類被加載入 Java 虛擬機以前動態改變類行爲。ASM 從類文件中讀入信息後,可以改變類行爲,分析類信息,甚至可以根據用戶要求生成新類。
不過ASM在建立class字節碼的過程當中,操縱的級別是底層JVM的彙編指令級別,這要求ASM使用者要對class組織結構和JVM彙編指令有必定的瞭解。
參考文檔