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

java中jdk代理和cglib代理使用步驟詳解

 更新時(shí)間:2023年11月30日 09:02:41   作者:山河亦問安  
這篇文章主要給大家介紹了關(guān)于java中jdk代理和cglib代理使用步驟的相關(guān)資料,JDK代理和CGLIB是Java中兩種常見的代理實(shí)現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在Java中,代理是一種設(shè)計(jì)模式,它允許一個(gè)對象(代理)控制對另一個(gè)對象(真實(shí)對象)的訪問。Java中的代理主要分為兩種類型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。

JDK 代理

JDK 代理是 Java 動(dòng)態(tài)代理的一種實(shí)現(xiàn)方式,它是通過 Java 反射機(jī)制來實(shí)現(xiàn)的。JDK 代理要求被代理的類必須實(shí)現(xiàn)一個(gè)或多個(gè)接口,因?yàn)樗腔诮涌诘拇怼?/p>

使用步驟:

定義接口: 定義一個(gè)接口,它是被代理類和代理類都要實(shí)現(xiàn)的接口。

public interface MyInterface {
    void doSomething();
}

實(shí)現(xiàn)真實(shí)對象類: 實(shí)現(xiàn)接口的真實(shí)對象類。

public class RealObject implements MyInterface {
    public void doSomething() {
        System.out.println("RealObject is doing something.");
    }
}

創(chuàng)建代理對象: 使用 Proxy.newProxyInstance() 方法創(chuàng)建代理對象。

RealObject realObject=new RealObject();

        MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(RealObject.class.getClassLoader(), RealObject.class.getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = method.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });
        proxyInstance.doSomething();

CGLIB 代理

CGLIB 代理是通過生成被代理類的子類來實(shí)現(xiàn)的,因此不要求被代理類實(shí)現(xiàn)接口,它可以代理沒有無參構(gòu)造函數(shù)的類。

創(chuàng)建代理對象: 使用 Enhancer 類創(chuàng)建代理對象。

 RealObject realObject=new RealObject();
       //代理是子類型,目標(biāo)是父類型
       RealObject proxy = (RealObject) Enhancer.create(RealObject.class, new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("Before invoking method.");
                Object result = methodProxy.invokeSuper(o, args);
//                Object invoke = methodProxy.invoke(realObject, args);
                System.out.println("After invoking method.");
                return result;
            }
        });

       proxy.doSomething();

附:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理的區(qū)別

  • 實(shí)現(xiàn)方式不同:JDK動(dòng)態(tài)代理是基于接口的動(dòng)態(tài)代理,而CGLIB動(dòng)態(tài)代理是基于繼承的動(dòng)態(tài)代理。
  • 代理對象類型不同:JDK動(dòng)態(tài)代理代理的對象必須實(shí)現(xiàn)一個(gè)接口,生成的代理對象類型是接口類型;而CGLIB動(dòng)態(tài)代理可以代理沒有實(shí)現(xiàn)接口的類,生成的代理對象類型是目標(biāo)對象的子類。
  • 性能不同:JDK動(dòng)態(tài)代理使用Java原生的反射機(jī)制進(jìn)行操作,因此在生成代理對象時(shí)會(huì)消耗一定的時(shí)間,但在執(zhí)行方法時(shí),因?yàn)槭墙涌诖?,所以調(diào)用速度相對較快;而CGLIB動(dòng)態(tài)代理使用ASM框架生成字節(jié)碼,因此在生成代理對象時(shí)比JDK動(dòng)態(tài)代理更快,但在調(diào)用方法時(shí),因?yàn)橐ㄟ^繼承來實(shí)現(xiàn)代理,所以調(diào)用速度相對較慢。
  • 引用的庫不同:JDK動(dòng)態(tài)代理不需要引用任何第三方庫,因?yàn)樗荍ava自帶的;而CGLIB動(dòng)態(tài)代理需要引用cglib庫和asm庫。
  • 對象的限制不同:JDK動(dòng)態(tài)代理只能代理實(shí)現(xiàn)了接口的類;而CGLIB動(dòng)態(tài)代理可以代理沒有實(shí)現(xiàn)接口的類。

總結(jié) 

到此這篇關(guān)于java中jdk代理和cglib代理使用步驟的文章就介紹到這了,更多相關(guān)java jdk代理和cglib代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例

    java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例

    這篇文章主要介紹了java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • springboot利用aspose預(yù)覽office文件的實(shí)現(xiàn)過程

    springboot利用aspose預(yù)覽office文件的實(shí)現(xiàn)過程

    這篇文章主要給大家介紹了關(guān)于springboot利用aspose預(yù)覽office文件的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2021-06-06
  • Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟

    Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟

    這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 解決SpringBoot web項(xiàng)目啟動(dòng)后立即關(guān)閉的問題

    解決SpringBoot web項(xiàng)目啟動(dòng)后立即關(guān)閉的問題

    這篇文章主要介紹了解決SpringBoot web項(xiàng)目啟動(dòng)后立即關(guān)閉的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot項(xiàng)目集成MinIO全過程

    SpringBoot項(xiàng)目集成MinIO全過程

    這篇文章主要介紹了SpringBoot項(xiàng)目集成MinIO全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    這篇文章主要介紹了SpringBoot Controller中的常用注解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解Spring?Boot中@PostConstruct的使用示例代碼

    詳解Spring?Boot中@PostConstruct的使用示例代碼

    在Java中,@PostConstruct是一個(gè)注解,通常用于標(biāo)記一個(gè)方法,它表示該方法在類實(shí)例化之后(通過構(gòu)造函數(shù)創(chuàng)建對象之后)立即執(zhí)行,這篇文章主要介紹了詳解Spring?Boot中@PostConstruct的使用,需要的朋友可以參考下
    2023-09-09
  • servlet簡單實(shí)現(xiàn)文件下載的方法

    servlet簡單實(shí)現(xiàn)文件下載的方法

    這篇文章主要介紹了servlet簡單實(shí)現(xiàn)文件下載的方法,涉及基于servlet技術(shù)實(shí)現(xiàn)流形式文件傳輸?shù)南嚓P(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • Redis框架Jedis及Redisson對比解析

    Redis框架Jedis及Redisson對比解析

    這篇文章主要介紹了Redis框架Jedis及Redisson對比解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 深入探討Java 中的 Object 類詳解(一切類的根基)

    深入探討Java 中的 Object 類詳解(一切類的根基)

    本文詳細(xì)介紹了Java中的Object類,作為所有類的根類,其重要性不言而喻,文章涵蓋了Object類的主要方法,如toString()、equals()、hashCode()等,本文深入探討 Object 類的作用、常用方法以及如何在實(shí)際開發(fā)中利用這些方法,感興趣的朋友一起看看吧
    2025-01-01

最新評(píng)論