Java中JDK動態(tài)代理的超詳細講解
1. 什么是動態(tài)代理?
動態(tài)代理是通過創(chuàng)建代理對象,在不改變原有代碼的基礎上,給程序增加新的功能,實現(xiàn)了程序的功能增強。
2.動態(tài)代理的實現(xiàn)方式有幾種?
- JDK動態(tài)代理
- CGLB動態(tài)代理
3. JDK動態(tài)代理
使用了JDK中的InvocationHandler接口,Method類和Proxy類。JDK的動態(tài)代理的要求:目標類必須要有接口。(目標類就是那個我們需要增強功能的方法所在的那個類,也是接口實現(xiàn)類所在的類)。我們通?;亟o目標類中要增強的方法增加上日志,事務等非業(yè)務功能。
4. CGLB動態(tài)代理
CGLB動態(tài)代理即Code Generation Library,是一個開源的第三方工具庫,其原理是繼承,去生成目標類的子類對象,這樣對子類的功能進行增強。但是要求:目標類不能用final修飾,目標類中的方法也不能被final修飾。
5.動態(tài)代理的效率
CGLB動態(tài)代理的效率要大于JDK動態(tài)代理的效率。
6.為什么要使用動態(tài)代理呢?
設計出來動態(tài)代理是為了解決一定的需求,因為在我們實際的開發(fā)過程中,經(jīng)常會遇到,要給寫好的某個方法的前面或者是后面增加方法,甚至是給好幾個類的方法增加新的功能。若是我們直接在方法上寫上新的增加的方法,就會顯得很亂,而且很冗余。
那么我們初步改進可以通過寫一個工具類去解決,在一個工具類中寫上我們要增強的方法,但是要求這些增強的方法是靜態(tài)修飾的,這樣我們就可以在原有的代碼上,使用類名.方法名的方式,來給原有的功能增加新的功能。這樣一定程度上的解決了代碼混亂的程度,但是還是不太完美。
再次改進:這個時候就是使用動態(tài)代理。
這就體現(xiàn)了動態(tài)代理的優(yōu)勢,即在不修改任何原有代碼的情況下,實現(xiàn)給原有功能的增強。
7. JDK動態(tài)代理詳細使用介紹
由于我們在Java項目中,直接使用動態(tài)代理的地方不多,所以我們都是使用的aspectj框架中寫好的動態(tài)代理。aspectj框架中的動態(tài)代理就是封裝的JDK動態(tài)代理。
下面將仔細介紹使用JDK動態(tài)代理的步驟:
- 最好可以先創(chuàng)建一個工具類,將要增強的功能先寫好,這樣我們便可以一句代碼能調(diào)動這個用來增強的功能。
- 自定義類,去實現(xiàn)InvocationHandler接口,并且,重寫invoke()方法。
- 在這個自定義的類中,添加Objeck屬性,并且寫上有參的構造方法。
- 在invoke()方法中寫上如下代碼

然后去主類中,使用動態(tài)代理,實現(xiàn)功能的增強。

注意:
上面的JDK動態(tài)代理的原理是反射機制。
我們可以使用proxy.getClass().getName()看到的值為com.sun.proxy.$Proxy
總結
到此這篇關于Java中JDK動態(tài)代理的文章就介紹到這了,更多相關Java JDK動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)經(jīng)典游戲超級瑪麗的示例代碼
在你的童年記憶里,是否有一個蹦跳、頂蘑菇的小人?本文將用java語言實現(xiàn)經(jīng)典游戲《超級瑪麗》,文中采用了swing技術進行了界面化處理,需要的可以參考一下2022-02-02
springboot后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫的便捷方法
實現(xiàn)springboot 后端配置多個數(shù)據(jù)源、Mysql數(shù)據(jù)庫,只需要新建 Mapper、實體類 相應的文件夾,將不同數(shù)據(jù)源的文件保存到對應的文件夾下,添加綁定數(shù)據(jù)庫配置Config,就可以輕松完成2021-08-08
JavaEE中struts2實現(xiàn)文件上傳下載功能實例解析
這篇文章主要為大家詳細介紹了JavaEE中struts2實現(xiàn)文件上傳下載功能實例,感興趣的小伙伴們可以參考一下2016-05-05

