之前介紹的反射和注解都是Java中的動(dòng)態(tài)特性,還有即將介紹的動(dòng)態(tài)代理也是Java中的一個(gè)動(dòng)態(tài)特性。這些動(dòng)態(tài)特性使得我們的程序很靈活。動(dòng)態(tài)代理是面向AOP編程的基礎(chǔ)。通過動(dòng)態(tài)代理,我們可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建一個(gè)類,實(shí)現(xiàn)某些接口中的方法,目前為止該特性已被廣泛應(yīng)用于各種框架和類庫中,例如:Spring,Hibernate,MyBatis等。理解動(dòng)態(tài)代理是理解框架底層的基礎(chǔ)。
     主要內(nèi)容如下:

  • 理解代理是何意

  • Java SDK實(shí)現(xiàn)動(dòng)態(tài)代理

  • 第三方庫cglib實(shí)現(xiàn)動(dòng)態(tài)代理

一、代理的概念
     單從字面上理解,代理就是指原對象的委托人,它不是原對象但是卻有原對象的權(quán)限。Java中的代理意思類似,就是指通過代理來操作原對象的方法和屬性,而原對象不直接出現(xiàn)。這樣做有幾點(diǎn)好處:

  • 節(jié)省創(chuàng)建原對象的高開銷,創(chuàng)建一個(gè)代理并不會(huì)立馬創(chuàng)建一個(gè)實(shí)際原對象,而是保存一個(gè)原對象的地址,按需加載

  • 執(zhí)行權(quán)限檢查,保護(hù)原對象

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

實(shí)際上代理堵在了原對象的前面,在代理的內(nèi)部往往還是調(diào)用了原對象的方法,只是它還做了其他的一些操作。下面看第一種實(shí)現(xiàn)動(dòng)態(tài)代理的方式。

二、Java SDK實(shí)現(xiàn)動(dòng)態(tài)代理
     實(shí)現(xiàn)動(dòng)態(tài)代理主要有如下幾個(gè)步驟:

  • 實(shí)現(xiàn) InvocationHandler接口,完成自定義調(diào)用處理器

  • 通過Proxy的getProxyClass方法獲取對應(yīng)的代理類

  • 利用反射技術(shù)獲取該代理類的constructor構(gòu)造器

  • 利用constructor構(gòu)造代理實(shí)例對象

網(wǎng)友評論