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