我們知道Java里面有一個類java.lang.reflect.Proxy能實現所謂的動態代理,其核心思想是在運行時動態生成一個類,該類繼承了 java.lang.reflect.Proxy,實現了指定接口。該類將對于接口方法的調用都動態分派到一個所謂的Handler那兒去,開發者可以實 現自己的Handler,截獲調用,進行面向方面的處理。因此動態代理這個功能往往用來實現AOP方面的功能。
這個動態類是利用虛擬機生成的。知道動態代理的原理之后,我們完全可以自己實現這樣一個動態代理,只要生成該類的class文件的內存映象即可。現在網上 由許多這種修改類或者干脆生成類的Java字節碼的工具,其中Apache網站的cglib以及它依賴的項目BCEL都可以實現,但是這些類庫的缺陷是太 過龐大,依賴其他第三方類庫的地方太多,造成可實用不是太強,這是現Java開源項目的一個通病。
ObjectWeb上面有個項目叫ASM(含義是Java字節碼的匯編語言)。它是一個Java字節碼修改框架,能直接生成二進制類代碼或者動態修改類代 碼,生成stub類或者其他類似代理類。ASM要比BCEL和SERP小的多,其核心部分才33KB,速度也要比這些工具快的多,大概要比BCEL快7 倍,比SERP快11倍。由于ASM設計的目的就是在運行時使用,因此它的體積盡可能小,速度盡可能快。
動態代理有一個很好的用處就是生成調用stub,截獲類調用,添加一些橫向功能。這在EJB容器、Web容器等應用服務器實現時尤其有用。采用這種接口, 你可以簡單的實現面向方面的功能,比如添加安全、事務、日志、過濾、編碼、解碼等等的功能,而且是純粹熱插拔的模式。總之使用動態代理能夠實現許多AOP 方面的功能。
只要一個電話
我們免費為您回電