CGLIB介紹與原理(部分節選自網絡)java
1、什麼是CGLIB?node
CGLIB是一個功能強大,高性能的代碼生成包。它爲沒有實現接口的類提供代理,爲JDK的動態代理提供了很好的補充。一般可使用Java的動態代理建立代理,但當要代理的類沒有實現接口或者爲了更好的性能,CGLIB是一個好的選擇。網絡
關於Java動態代理,請參見個人另外一篇文章:Java動態代理詳解 http://shensy.iteye.com/blog/1698197框架
2、CGLIB原理工具
CGLIB原理:動態生成一個要代理類的子類,子類重寫要代理的類的全部不是final的方法。在子類中採用方法攔截的技術攔截全部父類方法的調用,順勢織入橫切邏輯。它比使用java反射的JDK動態代理要快。性能
CGLIB底層:使用字節碼處理框架ASM,來轉換字節碼並生成新的類。不鼓勵直接使用ASM,由於它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉。spa
CGLIB缺點:對於final方法,沒法進行代理。代理
3、CGLIB的應用orm
普遍的被許多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB來代理單端single-ended(多對一和一對一)關聯。blog
4、CGLIB的API
一、Jar包:
cglib-nodep-2.2.jar:使用nodep包不須要關聯asm的jar包,jar包內部包含asm的類.
cglib-2.2.jar:使用此jar包須要關聯asm的jar包,不然運行時報錯.
二、CGLIB類庫:
因爲基本代碼不多,學起來有必定的困難,主要是缺乏文檔和示例,這也是CGLIB的一個不足之處。
本系列使用的CGLIB版本是2.2。
net.sf.cglib.core:底層字節碼處理類,他們大部分與ASM有關係。
net.sf.cglib.transform:編譯期或運行期類和類文件的轉換
net.sf.cglib.proxy:實現建立代理和方法攔截器的類
net.sf.cglib.reflect:實現快速反射和C#風格代理的類
net.sf.cglib.util:集合排序等工具類
net.sf.cglib.beans:JavaBean相關的工具類
本實戰系列主要涉及的包:net.sf.cglib.proxy、net.sf.cglib.reflect、net.sf.cglib.util、net.sf.cglib.beans