114培訓(xùn)網(wǎng)歡迎您來(lái)到欣才IT!

400-850-8622

全國(guó)統(tǒng)一學(xué)習(xí)專(zhuān)線(xiàn) 8:30-21:00

       我們知道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 方面的功能。

溫馨提示:為不影響您的學(xué)業(yè),來(lái)校區(qū)前請(qǐng)先電話(huà)咨詢(xún),方便我校安排相關(guān)的專(zhuān)業(yè)老師為您解答
  • 詳情請(qǐng)進(jìn)入欣才IT
  • 已關(guān)注:12442
  • 咨詢(xún)電話(huà):
相關(guān)資料
姓名不能為空
手機(jī)號(hào)格式錯(cuò)誤