背景
對于沒有實(shí)現(xiàn)接口的類方库,不能使用動(dòng)態(tài)代理Proxy。
而CGLIB則可以實(shí)現(xiàn)對類的動(dòng)態(tài)代理.
使用cglib[Code Generation Library]實(shí)現(xiàn)動(dòng)態(tài)代理痰洒,并不要求委托類必須實(shí)現(xiàn)接口,底層采用asm字節(jié)碼生成框架生成代理類的字節(jié)碼
原理:
對指定的目標(biāo)類生成一個(gè)子類,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng)庄吼,但因?yàn)椴捎玫氖抢^承,所以不能對final修飾的類進(jìn)行代理严就。
在子類中采用方法攔截的技術(shù)攔截所有父類方法的調(diào)用总寻,順勢織入橫切邏輯。它比使用java反射的JDK動(dòng)態(tài)代理要快梢为。
底層:使用字節(jié)碼處理框架ASM渐行,來轉(zhuǎn)換字節(jié)碼并生成新的類。不鼓勵(lì)直接使用ASM铸董,因?yàn)樗竽惚仨殞VM內(nèi)部結(jié)構(gòu)包括class文件的格式和指令集都很熟悉祟印。
與動(dòng)態(tài)代理的比較
CGLib創(chuàng)建的動(dòng)態(tài)代理對象性能比JDK創(chuàng)建的動(dòng)態(tài)代理對象的性能高不少,但是CGLib在創(chuàng)建代理對象時(shí)所花費(fèi)的時(shí)間卻比JDK多得多粟害,所以對于單例的對象蕴忆,因?yàn)闊o需頻繁創(chuàng)建對象,用CGLib合適悲幅,反之套鹅,使用JDK方式要更為合適一些站蝠。
如何生成一個(gè)class文件:
jdk和cglib生成字節(jié)碼文件分別用的sun的ProxyGenerator和開源項(xiàng)目ASM字節(jié)碼框架。
jdk采用反射機(jī)制調(diào)用委托類的方法卓鹿,cglib采用類似索引的方式直接調(diào)用委托類方法菱魔;
缺點(diǎn)
CGLib由于是采用動(dòng)態(tài)創(chuàng)建子類的方法,對于final方法减牺,無法進(jìn)行代理豌习。
refer
回調(diào)過濾器以及延遲加載
http://blog.csdn.net/zghwaicsdn/article/details/50957474
CGLIB中BeanCopier源碼實(shí)現(xiàn)
http://www.reibang.com/p/f8b892e08d26
demo
http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html
全面的源碼分析,一系列
http://www.cnblogs.com/cruze/p/3843996.html
大概的架構(gòu)介紹
http://www.cnblogs.com/davidwang456/p/5654097.html
jdk動(dòng)態(tài)代理與cglib區(qū)別
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