當前位置:
首頁 > 最新 > CGLIB 與動態代理

CGLIB 與動態代理

CGLIB介紹

Cglib(Byte Code Generation Library )是一個高層次的生成與轉化Java位元組碼的API。之所以稱為高層次是因為它底層採用ASM(位元組碼操作框架)。通過生成動態代理對象與攔截屬性訪問,cglib使用在AOP,測試,數據訪問框架中。

常用的使用框架:Spring ,Hibernate,Mybatis。


CGLIB原理

位元組碼

Cglib是位元組碼生成工具包,位元組碼指Java位元組碼,通常開發Java編寫的為Java源文件,以.java結尾,然後用編譯器編譯成class文件。class文件就是位元組碼文件,可以用編輯器打開,可以看到class文件對應的為二進位文件,它包含的是與平台無關的能被JVM執行的指令格式,所以稱之為位元組碼文件。

JVM能夠讀取所有符合JVM規範的位元組碼。JAVA位元組碼不僅能夠以文件的形式存儲在磁碟上,還可以以網路的方式進行下載,還可以存在內存中。JVM中的類載入器會負責將包含位元組代碼的位元組數組(byte[])中定義出類。在某些時候,可以動態生成Java位元組碼,或者對已有的位元組碼進行修改,在這裡就要提到本文提到的ASM與CGLIB了。CGLIB本質就是封裝了ASM,簡化了ASM的操作,實現了在運行器生成新的位元組碼。


CGLIB組成結構


CGLIB實現動態代理

之前的博客寫過採用JDK自帶的代理類實現動態代理,但必須代理類與被代理類必須實現同一介面,這就限制了某些沒有實現介面的類的動態代理功能。採用CGLIB類實現的動態代理無需實現通過介面,下面進行具體介紹。

導入maven包。直接引入cglib-nodep包,這樣就無需導入其他包,直接引入cglib需要依賴其他的包。

定義業務邏輯。

實現MethodInterceptor介面,定義方法的攔截器

驗證

運行結果


總結

基於CGLIB實現的動態代理相比JDK動態代理而言,無侵入型,無需實現介面。基於對位元組碼的修改,生成要代理類的子類,然後再子類中回調代理類的方法。但要注意CGLIB無法代理基於Final或private修飾的方法。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

我是狼,但我不「吃雞」
你羨慕身邊談戀愛的人么?

TAG:全球大搜羅 |