最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDK動態(tài)代理詳細解析

 更新時間:2023年11月27日 10:13:21   作者:一碼評川  
這篇文章主要介紹了JDK動態(tài)代理詳細解析,在Java的動態(tài)代理機制中,有兩個重要的類和接口,一個是InvoInvocationHandler(接口)、Proxy(類),這一個類和接口是我們動態(tài)代理所必須用到的,需要的朋友可以參考下

一、說明

在Java的動態(tài)代理機制中,有兩個重要的類和接口,一個是InvoInvocationHandler(接口)、Proxy(類),這一個類和接口是我們動態(tài)代理所必須用到的。

在這里插入圖片描述

優(yōu)點:

  • 對于實現(xiàn)了接口的類,可以直接使用基于接口的動態(tài)代理進行代理,非常方便
  • 代理類和被代理類都必須實現(xiàn)同一個接口,能夠?qū)崿F(xiàn)對被代理對象的方法調(diào)用進行統(tǒng)一管理。
  • 性能上:在老版的jdk,jdk代理生成的類速度快,通過反射調(diào)用慢,cglib是jdk代理速度的10倍左右,jdk在版本每次升級都會有很大的性能提升,cglib停滯不前,jdk7 8的動態(tài)代理性能在1萬次實驗中比cglib要快20%左右
  • jdk動態(tài)代理如果目標類未實現(xiàn)接口則無法代理,cglib是通過繼承的方式來動態(tài)代理,若目標類被final關(guān)鍵字修飾,則無法使用cglib做動態(tài)代理

缺點:

  • 只能代理實現(xiàn)了接口的類,對于沒有實現(xiàn)接口的類無法使用此種方式進行代理。
  • jdk動態(tài)代理只提供實現(xiàn)接口的目標類代理,不支持沒有實現(xiàn)接口的目標類的代理。如果目標類沒有實現(xiàn)接口,只能用cglib代理

二、主要類方法的說明

InvocationHandler接口

每個動態(tài)代理類都必須實現(xiàn)InvocationHandler接口,并且每個代理類的實例都關(guān)聯(lián)到了一個handler,當(dāng)我們通過代理對象調(diào)用一個方法的時候,這個方法的調(diào)用就會被轉(zhuǎn)發(fā)為由InvocationHandler接口的invoke方法來進行調(diào)用。

InvocationHandler接口的invoke方法

  • Object invoke(Object proxy, Method method, Object[] args) throws Throwable
  • proxy:  - 指代我們所代理的那個真實對象
  • method: - 指代的是我們所要調(diào)用真實對象的某個方法的Method對象
  • args:  - 指代的是調(diào)用真實對象某個方法時接受的參數(shù)

**proxy存在的意義:**

1. 可以使用反射獲取代理對象的信息(也就是proxy.getClass().getName())。

2. 可以將代理對象返回以進行連續(xù)調(diào)用,這就是proxy存在的目的,因為this并不是代理對象。

Proxy 類

Proxy類的作用就是用來動態(tài)創(chuàng)建一個代理類對象的類,它提供了許多的方法,但是我們用的最多的就是newProxyInstance這個方法

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
  • loader:   一個ClassLoader對象,定義了由哪個ClassLoader對象來對生成的代理對象進行加載
  • interfaces:  一個Interface對象的數(shù)組,表示的是我將要給我需要代理的對象提供一組什么接口,如果我提供了一組接口給它,那么這個代理對象就宣稱實現(xiàn)了該接口(多態(tài)),這樣我就能調(diào)用這組接口中的方法了
  • h:   一個InvocationHandler對象,表示的是當(dāng)我這個動態(tài)代理對象在調(diào)用方法的時候,會關(guān)聯(lián)到哪一個InvocationHandler對象上

打印代理的類:

System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

三、關(guān)鍵步驟

創(chuàng)建InvocationHandler實現(xiàn)類

public class MapperProxy<T> implements InvocationHandler {
      private Class<T> proxyInterface;
    //這里可以維護一個緩存,存這個接口的方法抽象的對象
    MapperProxy(Class<T> proxyInterface){
        this.proxyInterface = proxyInterface;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("執(zhí)行前...");
        Constructor constructor  = proxyInterface.getConstructor();
        Object o =  constructor.newInstance();
        method.invoke(o,args);
        System.out.println("執(zhí)行后");
        return null;
    }
}

通過 Proxy.newProxyInstance() 創(chuàng)建代理實例

 Fly fly = (Fly) Proxy.newProxyInstance(MyFly.class.getClassLoader(),new Class[]{Fly.class, Fly.Fly2.class},new MapperProxy<>(MyFly.class));

在這里插入圖片描述

-  創(chuàng)建代理類-   Class<?> cl = getProxyClass0(loader, intfs);

-  獲取有參構(gòu)造器  Constructor<?> cons = cl.getConstructor(constructorParams);這里的參數(shù)就是InvocationHandler

-  通過構(gòu)造器創(chuàng)建代理實例-參數(shù)就是方法的第三個參數(shù)

分析生成的代理類

在這里插入圖片描述

在這里插入圖片描述

結(jié)論 

  • 代理類會繼承Proxy ,這里也就解釋了為什么通過JDK生成的代理無法代理非接口實現(xiàn)類了
  • 代理類實現(xiàn)了傳入的所有接口類型

調(diào)用代理類的doFly()

這里會調(diào)用 super.h.invoke(this, m3, (Object[])null);

super.h就是我們再創(chuàng)建代理對象是傳入的MapperProxy,所有這里會執(zhí)行MapperProxy.invoke方法(在這里我們就可動態(tài)的對該執(zhí)行方法進行增強)

在這里插入圖片描述

到此這篇關(guān)于JDK動態(tài)代理詳細解析的文章就介紹到這了,更多相關(guān)JDK動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot yml配置文件調(diào)用過程解析

    SpringBoot yml配置文件調(diào)用過程解析

    這篇文章主要介紹了SpringBoot yml配置文件調(diào)用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot實現(xiàn)單文件與多文件上傳

    SpringBoot實現(xiàn)單文件與多文件上傳

    本次例子不基于第三方存儲(如七牛云對象存儲、阿里云對象存儲、騰訊云對象存儲等),僅基于本地存儲。本文主要內(nèi)容如下:公共文件存儲代碼;單文件上傳代碼;多文件上傳代碼
    2021-05-05
  • libsvm支持向量機回歸示例

    libsvm支持向量機回歸示例

    這篇文章主要介紹了libsvm支持向量機回歸示例,需要的朋友可以參考下
    2014-05-05
  • spring boot 防止重復(fù)提交實現(xiàn)方法詳解

    spring boot 防止重復(fù)提交實現(xiàn)方法詳解

    這篇文章主要介紹了spring boot 防止重復(fù)提交實現(xiàn)方法,結(jié)合實例形式詳細分析了spring boot 防止重復(fù)提交具體配置、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 關(guān)于java后端的詳解

    關(guān)于java后端的詳解

    在本篇文章里小編給各位分享的是關(guān)于java后端的知識點詳解,學(xué)習(xí)java的朋友們可以參考下。
    2019-08-08
  • 解讀Spring-boot的debug調(diào)試

    解讀Spring-boot的debug調(diào)試

    這篇文章主要介紹了解讀Spring-boot的debug調(diào)試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題

    SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題

    這篇文章主要介紹了SpringBoot解決同名類導(dǎo)致的bean名沖突bean name conflicts問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java字段初始化的規(guī)律解析

    Java字段初始化的規(guī)律解析

    這篇文章主要介紹了Java字段初始化的規(guī)律解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringMVC中的異常處理機制詳解

    SpringMVC中的異常處理機制詳解

    SpringMVC提供了基于xml和基于注解的異常處理機制,一般情況下兩者都要進行配置,xml異常處理機制主要用于處理xml方式產(chǎn)生的異常,注解異常處理機制主要用于處理基于注解方式產(chǎn)生的異常,這篇文章主要介紹了SpringMVC中的異常處理機制,需要的朋友可以參考下
    2024-05-05
  • 教你用Springboot實現(xiàn)攔截器獲取header內(nèi)容

    教你用Springboot實現(xiàn)攔截器獲取header內(nèi)容

    項目中遇到一個需求,對接上游系統(tǒng)是涉及到需要增加請求頭,請求頭的信息是動態(tài)獲取的,需要動態(tài)從下游拿到之后轉(zhuǎn)給上游,文中非常詳細的介紹了該需求的實現(xiàn),需要的朋友可以參考下
    2021-05-05

最新評論

双城市| 永年县| 揭西县| 武冈市| 恩施市| 沂南县| 南投市| 城步| 牡丹江市| 丹江口市| 县级市| 右玉县| 商水县| 西林县| 嘉义市| 鄂尔多斯市| 农安县| 岱山县| 应城市| 恩施市| 榆树市| 贡嘎县| 岗巴县| 清涧县| 祁连县| 斗六市| 高密市| 棋牌| 白沙| 观塘区| 隆子县| 梅河口市| 宁武县| 乳山市| 乌恰县| 江山市| 休宁县| 视频| 五家渠市| 行唐县| 象州县|