之前介紹的反射和注解都是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ù)原對象
實(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í)例對象