欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中JDK動態(tài)代理的超詳細(xì)講解

 更新時間:2022年10月21日 08:58:54   作者:白胡子永遠(yuǎn)  
JDK 的動態(tài)代理是基于攔截器和反射來實現(xiàn)的,JDK代理是不需要第三方庫支持的,只需要JDK環(huán)境就可以進(jìn)行代理,下面這篇文章主要給大家介紹了關(guān)于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)文章

  • Java之類加載機(jī)制案例講解

    Java之類加載機(jī)制案例講解

    這篇文章主要介紹了Java之類加載機(jī)制案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談java中String與StringBuffer的不同

    淺談java中String與StringBuffer的不同

    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)用操作

    這篇文章主要介紹了數(shù)組實現(xiàn)Java 自定義Queue隊列及應(yīng)用操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot項目防止反編譯的方案

    SpringBoot項目防止反編譯的方案

    最近項目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去,要求對正式環(huán)境的啟動包進(jìn)行安全性處理,防止客戶直接通過反編譯工具將代碼反編譯出來,所以本文給大家介紹了SpringBoot項目如何防止反編譯,需要的朋友可以參考下
    2024-01-01
  • SpringBoot設(shè)置首頁(默認(rèn)頁)跳轉(zhuǎn)功能的實現(xiàn)方案

    SpringBoot設(shè)置首頁(默認(rèn)頁)跳轉(zhuǎn)功能的實現(xiàn)方案

    這篇文章主要介紹了SpringBoot設(shè)置首頁(默認(rèn)頁)跳轉(zhuǎn)功能,本文通過兩種方案,給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例

    Java實現(xiàn)的獲取和判斷文件頭信息工具類用法示例

    這篇文章主要介紹了Java實現(xiàn)的獲取和判斷文件頭信息工具類,結(jié)合實例形式分析了Java針對文件讀取及頭信息判斷相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Java算法實現(xiàn)楊輝三角的講解

    Java算法實現(xiàn)楊輝三角的講解

    今天小編就為大家分享一篇關(guān)于Java算法實現(xiàn)楊輝三角的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java 8 lambda表達(dá)式引入詳解及實例

    Java 8 lambda表達(dá)式引入詳解及實例

    這篇文章主要介紹了Java 8 lambda表達(dá)式引入詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 聊聊RabbitMQ發(fā)布確認(rèn)高級問題

    聊聊RabbitMQ發(fā)布確認(rèn)高級問題

    這篇文章主要介紹了RabbitMQ發(fā)布確認(rèn)高級問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Logger.error打印錯誤異常的詳細(xì)堆棧信息

    Logger.error打印錯誤異常的詳細(xì)堆棧信息

    這篇文章主要介紹了Logger.error打印錯誤異常的詳細(xì)堆棧信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評論