Java中JDK動態(tài)代理的超詳細(xì)講解
1. 什么是動態(tài)代理?
動態(tài)代理是通過創(chuàng)建代理對象,在不改變原有代碼的基礎(chǔ)上,給程序增加新的功能,實現(xiàn)了程序的功能增強(qiáng)。
2.動態(tài)代理的實現(xiàn)方式有幾種?
- JDK動態(tài)代理
- CGLB動態(tài)代理
3. JDK動態(tài)代理
使用了JDK中的InvocationHandler接口,Method類和Proxy類。JDK的動態(tài)代理的要求:目標(biāo)類必須要有接口。(目標(biāo)類就是那個我們需要增強(qiáng)功能的方法所在的那個類,也是接口實現(xiàn)類所在的類)。我們通?;亟o目標(biāo)類中要增強(qiáng)的方法增加上日志,事務(wù)等非業(yè)務(wù)功能。
4. CGLB動態(tài)代理
CGLB動態(tài)代理即Code Generation Library,是一個開源的第三方工具庫,其原理是繼承,去生成目標(biāo)類的子類對象,這樣對子類的功能進(jìn)行增強(qiáng)。但是要求:目標(biāo)類不能用final修飾,目標(biāo)類中的方法也不能被final修飾。
5.動態(tài)代理的效率
CGLB動態(tài)代理的效率要大于JDK動態(tài)代理的效率。
6.為什么要使用動態(tài)代理呢?
設(shè)計出來動態(tài)代理是為了解決一定的需求,因為在我們實際的開發(fā)過程中,經(jīng)常會遇到,要給寫好的某個方法的前面或者是后面增加方法,甚至是給好幾個類的方法增加新的功能。若是我們直接在方法上寫上新的增加的方法,就會顯得很亂,而且很冗余。
那么我們初步改進(jìn)可以通過寫一個工具類去解決,在一個工具類中寫上我們要增強(qiáng)的方法,但是要求這些增強(qiáng)的方法是靜態(tài)修飾的,這樣我們就可以在原有的代碼上,使用類名.方法名的方式,來給原有的功能增加新的功能。這樣一定程度上的解決了代碼混亂的程度,但是還是不太完美。
再次改進(jìn):這個時候就是使用動態(tài)代理。
這就體現(xiàn)了動態(tài)代理的優(yōu)勢,即在不修改任何原有代碼的情況下,實現(xiàn)給原有功能的增強(qiáng)。
7. JDK動態(tài)代理詳細(xì)使用介紹
由于我們在Java項目中,直接使用動態(tài)代理的地方不多,所以我們都是使用的aspectj框架中寫好的動態(tài)代理。aspectj框架中的動態(tài)代理就是封裝的JDK動態(tài)代理。
下面將仔細(xì)介紹使用JDK動態(tài)代理的步驟:
- 最好可以先創(chuàng)建一個工具類,將要增強(qiáng)的功能先寫好,這樣我們便可以一句代碼能調(diào)動這個用來增強(qiáng)的功能。
- 自定義類,去實現(xiàn)InvocationHandler接口,并且,重寫invoke()方法。
- 在這個自定義的類中,添加Objeck屬性,并且寫上有參的構(gòu)造方法。
- 在invoke()方法中寫上如下代碼
然后去主類中,使用動態(tài)代理,實現(xiàn)功能的增強(qiáng)。
注意:
上面的JDK動態(tài)代理的原理是反射機(jī)制。
我們可以使用proxy.getClass().getName()看到的值為com.sun.proxy.$Proxy
總結(jié)
到此這篇關(guān)于Java中JDK動態(tài)代理的文章就介紹到這了,更多相關(guān)Java JDK動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
- String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨(dú)占的,是可變的(因為每次都是創(chuàng)建新的對象?。?/div> 2015-11-11
數(shù)組實現(xiàn)Java 自定義Queue隊列及應(yīng)用操作
這篇文章主要介紹了數(shù)組實現(xiàn)Java 自定義Queue隊列及應(yīng)用操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot設(shè)置首頁(默認(rèn)頁)跳轉(zhuǎn)功能的實現(xiàn)方案
這篇文章主要介紹了SpringBoot設(shè)置首頁(默認(rèn)頁)跳轉(zhuǎn)功能,本文通過兩種方案,給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例
這篇文章主要介紹了Java實現(xiàn)的獲取和判斷文件頭信息工具類,結(jié)合實例形式分析了Java針對文件讀取及頭信息判斷相關(guān)操作技巧,需要的朋友可以參考下2017-11-11最新評論