5、cglib概述

背景

對於沒有實現接口的類,不能使用動態代理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
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章