背景
對於沒有實現接口的類,不能使用動態代理Proxy。
而CGLIB則可以實現對類的動態代理.
使用cglib[Code Generation Library]實現動態代理,並不要求委託類必須實現接口,底層採用asm字節碼生成框架生成代理類的字節碼
原理:
對指定的目標類生成一個子類,並覆蓋其中方法實現增強,但因爲採用的是繼承,所以不能對final修飾的類進行代理。
在子類中採用方法攔截的技術攔截所有父類方法的調用,順勢織入橫切邏輯。它比使用java反射的JDK動態代理要快。
底層:使用字節碼處理框架ASM,來轉換字節碼並生成新的類。不鼓勵直接使用ASM,因爲它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉。
與動態代理的比較
CGLib創建的動態代理對象性能比JDK創建的動態代理對象的性能高不少,但是CGLib在創建代理對象時所花費的時間卻比JDK多得多,所以對於單例的對象,因爲無需頻繁創建對象,用CGLib合適,反之,使用JDK方式要更爲合適一些。
如何生成一個class文件:
jdk和cglib生成字節碼文件分別用的sun的ProxyGenerator和開源項目ASM字節碼框架。
jdk採用反射機制調用委託類的方法,cglib採用類似索引的方式直接調用委託類方法;
缺點
CGLib由於是採用動態創建子類的方法,對於final方法,無法進行代理。
refer
回調過濾器以及延遲加載
http://blog.csdn.net/zghwaicsdn/article/details/50957474
CGLIB中BeanCopier源碼實現
http://www.jianshu.com/p/f8b892e08d26
demo
http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html
全面的源碼分析,一系列
http://www.cnblogs.com/cruze/p/3843996.html
大概的架構介紹
http://www.cnblogs.com/davidwang456/p/5654097.html
jdk動態代理與cglib區別
http://www.cnblogs.com/chinajava/p/5880887.html
javadoc
http://cglib.sourceforge.net/apidocs/
http://javadox.com/cglib/cglib/2.2/net/sf/cglib/proxy/Enhancer.html
JDK 和CGLIB、Javassist、ASM
http://www.voidcn.com/blog/chenchaofuck1/article/p-6066671.html
http://www.voidcn.com/blog/zmx729618/article/p-5987634.html
cglib手冊
https://dzone.com/articles/cglib-missing-manual
轉摘於:https://www.jianshu.com/p/27484d2c47d3