亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java的CGLIB動(dòng)態(tài)代理深入解析

 更新時(shí)間:2023年11月27日 09:53:54   作者:一碼評(píng)川  
這篇文章主要介紹了Java的CGLIB動(dòng)態(tài)代理深入解析,CGLIB是強(qiáng)大的、高性能的代碼生成庫(kù),被廣泛應(yīng)用于AOP框架,它底層使用ASM來(lái)操作字節(jié)碼生成新的類(lèi),為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問(wèn),需要的朋友可以參考下

一、介紹

CGLIB是強(qiáng)大的、高性能的代碼生成庫(kù),被廣泛應(yīng)用于AOP框架,它底層使用ASM來(lái)操作字節(jié)碼生成新的類(lèi),為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問(wèn)。

CGLIB相比于JDK動(dòng)態(tài)代理更加強(qiáng)大,JDK動(dòng)態(tài)代理只能對(duì)接口進(jìn)行代理,而CGLIB既可以代理普通類(lèi),也能夠代理接口。

優(yōu)點(diǎn): 通過(guò)FastClass機(jī)制調(diào)用方法,比JDK動(dòng)態(tài)代理的反射機(jī)制效率高;被代理類(lèi)無(wú)需實(shí)現(xiàn)接口

缺點(diǎn): 運(yùn)行期生成字節(jié)碼,通過(guò)ASM寫(xiě)Class字節(jié)碼,效率低;不能對(duì)final類(lèi)及final方法進(jìn)行代理

二、工作原理

g

CGLIB 通過(guò)動(dòng)態(tài)生成一個(gè)需要被代理類(lèi)的子類(lèi)(即被代理類(lèi)作為父類(lèi)),該子類(lèi)重寫(xiě)被代理類(lèi)的所有不是 final 修飾的方法,并在子類(lèi)中采用方法攔截的技術(shù)攔截父類(lèi)所有的方法調(diào)用,進(jìn)而織入橫切邏輯。此外,因?yàn)?CGLIB 采用整型變量建立了方法索引,這比使用 JDK 動(dòng)態(tài)代理更快(使用 Java 反射技術(shù)創(chuàng)建代理類(lèi)的實(shí)例)。

2.1步驟說(shuō)明

生成代理對(duì)象 創(chuàng)建要被代理的類(lèi)或接口–MyFly

public class MyFly implements Fly {
    @Override
    public void doFly() {
        System.out.println("wo的");
    }
}

實(shí)現(xiàn)MethodInterceptor并實(shí)現(xiàn)intercept方法 --CglibProxy

class CglibProxy implements MethodInterceptor {
    /**
     * @param o:           代理對(duì)象
     * @param method:      被代理方法
     * @param params:      方法入?yún)?
     * @param methodProxy: CGLIB方法
     **/
    @Override
    public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
        System.out.println("【增強(qiáng)方法】代理對(duì)象正在執(zhí)行的方法:" + method.getName());
        Object result = methodProxy.invokeSuper(o, params);
        return result;
    }
}

創(chuàng)建Enhancer(設(shè)置要被代理的類(lèi)和調(diào)用方法時(shí)觸發(fā)的攔截器)

 public static Object creatCglibProxyObj(Class<?> clazz) {
        Enhancer enhancer = new Enhancer();
        // 為加強(qiáng)器指定要代理的業(yè)務(wù)類(lèi)(即為下面生成的代理類(lèi)指定父類(lèi))
        enhancer.setSuperclass(clazz);
        // 設(shè)置回調(diào):對(duì)于代理類(lèi)上所有方法的調(diào)用,都會(huì)調(diào)用CallBack,而Callback則需要實(shí)現(xiàn)intercept()方法
        enhancer.setCallback(new CglibProxy());
        return enhancer.create();
    }

執(zhí)行程序

public static void main(String[] args) {
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");
        Fly fly = (Fly) CglibProxyFactory.creatCglibProxyObj(MyFly.class);
        fly.doFly();
    }

結(jié)果:

在這里插入圖片描述

2.2 代理對(duì)象分析

通過(guò)設(shè)置屬性來(lái)輸出生成的代理對(duì)象

System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");

在這里插入圖片描述

通過(guò)IDEA打開(kāi)class文件

2.2.1表頭分析

在這里插入圖片描述

結(jié)論: 生成的代理對(duì)象繼承了我們需要被代理的對(duì)象同時(shí)實(shí)現(xiàn)了Factory這里是通過(guò)繼承的方式來(lái)代理的,所以他即可以代理類(lèi)也可以代理接口因?yàn)槭抢^承了被代理類(lèi),所以在java中子類(lèi)是無(wú)法重寫(xiě)父類(lèi)final方法的,這也就解釋了為什么CGLIB無(wú)法代理final修飾的方法了

2.2.2 stataic 靜態(tài)代碼塊

在這里插入圖片描述

結(jié)論: 這里面創(chuàng)建了一些后續(xù)要試用的變量引用

2.2.3 重寫(xiě)父類(lèi)方法

在這里插入圖片描述

結(jié)論: 重寫(xiě)的方法被final,防止后面被修改這里的var10000就是我們?cè)趧?chuàng)建代理時(shí)傳入的CglibProxy這里也就解釋了CGLIB是如何動(dòng)態(tài)增強(qiáng)方法的基本邏輯(在每次調(diào)用方法時(shí)都會(huì)先去調(diào)用MethodInterceptor的實(shí)現(xiàn)類(lèi)中的intercept方法,然后我們只需要在intercept方法中實(shí)現(xiàn)要加強(qiáng)的代碼即可)

2.3 代理方法調(diào)用過(guò)程分析

調(diào)用代理方法

在這里插入圖片描述

結(jié)論: 創(chuàng)建代理對(duì)象fly通過(guò)調(diào)用代理對(duì)象fly.doFly()方法

在這里插入圖片描述

3. 調(diào)用MethodInterceptor的intercept方法,這里就是調(diào)用我們的CglibProxy

在這里插入圖片描述

4. 調(diào)用methodProxy.invokeSuper(o, params);這里就是要調(diào)用被代理類(lèi)的原始方法

在這里插入圖片描述

通過(guò)init()來(lái)初始化生成代理類(lèi)和被代理類(lèi)的FastClass

在這里插入圖片描述

helper:

在這里插入圖片描述

生成的FastClass文件

在這里插入圖片描述

生成的FastClass文件的invoke方法

在這里插入圖片描述

init完成后這里會(huì)繼續(xù)調(diào)用fci.f2.invoke(fci.i2, obj, args); 這里的fci.f2就是剛剛生成的代理對(duì)象FastCalss對(duì)象

在這里插入圖片描述

這里程序會(huì)傳入17,調(diào)用代理類(lèi)的CGLIB$doFly$0()方法;(大家可以debug看,每次生成的文件位置會(huì)不一樣)

在這里插入圖片描述

調(diào)用代理類(lèi)的CGLIB$doFly$0() 到這里基本可以知道它是如何幫助我們調(diào)用被代理類(lèi)的方法了這里的super指的就是MyFly,因?yàn)镃GLIB生成的代理類(lèi)繼承了我們要被代理的類(lèi)

在這里插入圖片描述

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

相關(guān)文章

  • springboot前端傳參date類(lèi)型后臺(tái)處理的方式

    springboot前端傳參date類(lèi)型后臺(tái)處理的方式

    這篇文章主要介紹了springboot前端傳參date類(lèi)型后臺(tái)處理的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot yml配置文件讀取方法詳解

    SpringBoot yml配置文件讀取方法詳解

    這篇文章主要介紹了SpringBoot yml配置文件讀取方法,項(xiàng)目開(kāi)發(fā)中難免要讀取配置文件,本文結(jié)合開(kāi)發(fā)經(jīng)驗(yàn)介紹幾種使用過(guò)的讀取配置文件的方法
    2022-10-10
  • Spring boot 添加jsp支持配置詳解

    Spring boot 添加jsp支持配置詳解

    本篇文章主要介紹了Spring boot 添加jsp支持配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • SpringBoot3各種配置的優(yōu)先級(jí)對(duì)比小結(jié)

    SpringBoot3各種配置的優(yōu)先級(jí)對(duì)比小結(jié)

    SpringBoot3提供了多種配置來(lái)源以滿(mǎn)足不同場(chǎng)景下的需求,本文詳細(xì)介紹了SpringBoot3中的配置優(yōu)先級(jí)對(duì)比小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序

    Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序

    這篇文章主要介紹了如何利用Java語(yǔ)言模擬QQ實(shí)現(xiàn)一個(gè)簡(jiǎn)易的聊天互動(dòng)程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • springboot CompletableFuture異步線程池詳解

    springboot CompletableFuture異步線程池詳解

    這篇文章主要介紹了springboot CompletableFuture異步線程池的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • MyBatis主鍵自增的兩種實(shí)現(xiàn)方法

    MyBatis主鍵自增的兩種實(shí)現(xiàn)方法

    本文主要介紹了MyBatis主鍵自增的兩種實(shí)現(xiàn)方法,主要包括注解方式或配置文件方式來(lái)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例

    Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例

    這篇文章主要介紹了Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例,當(dāng)在Spring項(xiàng)目中涉及數(shù)據(jù)庫(kù)操作時(shí),事務(wù)管理是非常重要的,它可以確保數(shù)據(jù)庫(kù)操作的一致性和完整性,Spring提供了強(qiáng)大的事務(wù)管理功能,可以通過(guò)聲明式或編程式兩種方式進(jìn)行配置,需要的朋友可以參考下
    2023-09-09
  • Spring Aware標(biāo)記接口使用案例解析

    Spring Aware標(biāo)記接口使用案例解析

    這篇文章主要介紹了Spring Aware標(biāo)記接口使用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • mybatis類(lèi)型轉(zhuǎn)換器如何實(shí)現(xiàn)數(shù)據(jù)加解密

    mybatis類(lèi)型轉(zhuǎn)換器如何實(shí)現(xiàn)數(shù)據(jù)加解密

    這篇文章主要介紹了mybatis類(lèi)型轉(zhuǎn)換器如何實(shí)現(xiàn)數(shù)據(jù)加解密,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論