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

Java的動態(tài)代理模式之Cglib代理詳解

 更新時間:2023年11月28日 08:33:59   作者:四葉草  
這篇文章主要介紹了Java的動態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構建一個子類對象從而實現(xiàn)對目標對象功能擴展,?有些書也將Cglib代理歸屬到動態(tài)代理,需要的朋友可以參考下

1.Cglib 代理模式的基本介紹

  1. 靜態(tài)代理和 JDK 代理模式都要求目標對象是實現(xiàn)一個接口,但是有時候目標對象只是一個 單獨的對象,并沒 有實現(xiàn)任何的接口,這個時候可使用目標對象子類來實現(xiàn)代理-這就是 Cglib 代理
  2. Cglib代理也叫作 子類代理,它是在內(nèi)存中構建一個子類對象從而實現(xiàn)對目標對象功能擴展, 有些書也將Cglib代理歸屬到動態(tài)代理。
  3. Cglib 是一個強大的高性能的代碼生成包,它可以在運行期擴展 java 類與實現(xiàn) java 接口.它廣泛的被許多 AOP 的框架使用,例如 SpringAOP,實現(xiàn)方法攔截
  4. 在 AOP 編程中如何選擇代理模式:

目標對象需要實現(xiàn)接口,用 JDK 代理

目標對象不需要實現(xiàn)接口,用 Cglib 代理

Cglib 包的底層是通過使用字節(jié)碼處理框架 ASM 來轉(zhuǎn)換字節(jié)碼并生成新的類

2.Cglib 代理模式實現(xiàn)步驟

需要引入 cglib 的 jar 文件

/*
cglib包結構:
net.sf.cglib.core    	底層字節(jié)碼處理類。
net.sf.cglib.transform  該包中的類用于class文件運行時轉(zhuǎn)換或編譯時轉(zhuǎn)換。
net.sf.cglib.proxy    	該包中的類用于創(chuàng)建代理和方法攔截。
net.sf.cglib.reflect    該包中的類用于快速反射,并提供了C#風格的委托。
net.sf.cglib.util    	集合排序工具類。
net.sf.cglib.beans    	JavaBean工具類。
*/

在內(nèi)存中動態(tài)構建子類,注意代理的類不能為 final,否則報錯java.lang.IllegalArgumentException:

目標對象的方法如果為 final/static,那么就不會被攔截,即不會執(zhí)行目標對象額外的業(yè)務方法.

3.cglib動態(tài)代理相關的基礎類

net.sf.cglib.proxy.Enhancer 主要的增強類。

net.sf.cglib.proxy.MethodInterceptor 主要的方法攔截類,它是Callback接口的子接口,需要用戶實現(xiàn)。

net.sf.cglib.proxy.MethodProxy JDK的java.lang.reflect.Method類的代理類,可以方便的實現(xiàn)對源對象方法的調(diào)用。

cglib是通過動態(tài)的生成一個子類去覆蓋所要代理類的非final方法,并設置好callback,則原有類的每個方法調(diào)用就會轉(zhuǎn)變成調(diào)用用戶定義的攔截方法(intercept)

4.Cglib 代理模式應用實例

4.1 導入pom.xml依賴

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>

4.2 目標類

//火車站
public class TrainStation {

    public void sell() {
        System.out.println("火車站賣票");
    }
}

4.3 代理工廠

//代理工廠
public class ProxyFactory implements MethodInterceptor {

    //聲明目標對象
    private TrainStation target = new TrainStation();

    public TrainStation getProxyObject() {
        //創(chuàng)建Enhancer對象,類似于JDK動態(tài)代理的Proxy類,下一步就是設置幾個參數(shù)
        Enhancer enhancer =new Enhancer();

        //設置代理對象的父類的字節(jié)碼對象(Class類型的對象) , 指定代理對象的父類
        enhancer.setSuperclass(target.getClass());

        //設置回調(diào)函數(shù) , 實現(xiàn)調(diào)用代理對象的方法時最終都會執(zhí)行MethodInterceptor的子實現(xiàn)類的intercept方法 , 在這個函數(shù)中利用反射完成任意目標類方法的調(diào)用
        enhancer.setCallback(this);

        //設置完參數(shù)后就可以 ,默認返回的是Object類型 , 可以進行強轉(zhuǎn) , 創(chuàng)建真正的代理對象
        TrainStation obj = (TrainStation) enhancer.create();
        return obj;
    }
    // intercept方法參數(shù)說明:
    //		返回值類型是調(diào)用方法的返回值類型
	//		o : 代理對象
	//		method : 真實對象中的方法的Method實例對象
	//		args : 實際參數(shù) , 可以是0到N個
	//		methodProxy :代理對象中的方法的method實例

    public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("代理點收取一些服務費用(CGLIB動態(tài)代理方式)");
        //調(diào)用目標對象的方法
        TrainStation result = (TrainStation) methodProxy.invokeSuper(o, args);
        return result;
    }
}

Enhancer類的常用方法

方法名功能
public Enhancer() , 無參構造創(chuàng)建Enhancer對象,類似于JDK動態(tài)代理的Proxy類,并不是真正的代理對象 , 還沒有設置參數(shù)
setSuperclass()設置代理對象的父類的字節(jié)碼對象(Class類型的對象) , 指定代理對象的父類 , 參數(shù)一般寫目標類的Class對象
setCallback()設置執(zhí)行哪個對象的回調(diào)函數(shù) , 調(diào)用代理對象的方法時最終都會執(zhí)行MethodInterceptor接口的子實現(xiàn)類對象的intercept方法 , 在intercept方法中利用反射完成任意目標類方法的調(diào)用 一般讓代理工廠實現(xiàn)MethodInterceptor接口 , 那么方法參數(shù)就可以寫this,這時MethodInterceptor接口的子實現(xiàn)類對象就是代理工廠對象
public Object create()創(chuàng)建真正的代理對象 , 默認返回的是Object類型 , 可以強轉(zhuǎn)為目標對象類型 , 創(chuàng)建真正的代理對象

4.4 測試類

//測試類
public class Client {
    public static void main(String[] args) {
        //創(chuàng)建代理工廠對象
        ProxyFactory factory = new ProxyFactory();
        
        //獲取代理對象
        TrainStation proxyObject = factory.getProxyObject();

        proxyObject.sell();
    }
}

5 jdk代理和CGLIB代理

  • 使用CGLib實現(xiàn)動態(tài)代理,CGLib底層采用ASM字節(jié)碼生成框架,使用字節(jié)碼技術生成代理類,在JDK1.6之前比使用Java反射效率要高。
  • 唯一需要注意的是,CGLib不能對聲明為final的類或者方法進行代理,因為CGLib原理是動態(tài)生成被代理類的子類。final修飾類不能被繼承 , final修飾的方法不能被重寫
  • 在JDK1.6、JDK1.7、JDK1.8逐步對JDK動態(tài)代理優(yōu)化之后,在調(diào)用次數(shù)較少的情況下,JDK代理效率高于CGLib代理效率,只有當進行大量調(diào)用的時候,JDK1.6和JDK1.7比CGLib代理效率低一點,但是到JDK1.8的時候,JDK代理效率高于CGLib代理。所以如果有接口使用JDK動態(tài)代理,如果沒有接口使用CGLIB代理。

6 代理模式優(yōu)缺點及使用場景

優(yōu)點:

  • 代理模式在客戶端與目標對象之間起到一個中介作用和保護目標對象的作用;
  • 代理對象可以擴展目標對象的功能;
  • 代理模式能將客戶端與目標對象分離,在一定程度上降低了系統(tǒng)的耦合度;

缺點:

  • 增加了系統(tǒng)的復雜度;

使用場景:

  • 遠程(Remote)代理
    • 本地服務通過網(wǎng)絡請求遠程服務。為了實現(xiàn)本地到遠程的通信,我們需要實現(xiàn)網(wǎng)絡通信,處理其中可能的異常。為良好的代碼設計和可維護性,我們將網(wǎng)絡通信部分隱藏起來,只暴露給本地服務一個接口,通過該接口即可訪問遠程服務提供的功能,而不必過多關心通信部分的細節(jié)。RPC思想
  • 防火墻(Firewall)代理
    • 當你將瀏覽器配置成使用代理功能時,防火墻就將你的瀏覽器的請求轉(zhuǎn)給互聯(lián)網(wǎng);當互聯(lián)網(wǎng)返回響應時,代理服務器再把它轉(zhuǎn)給你的瀏覽器。
  • 保護(Protect or Access)代理
    • 務一個接口,通過該接口即可訪問遠程服務提供的功能,而不必過多關心通信部分的細節(jié)。RPC思想
  • 防火墻(Firewall)代理
    • 當你將瀏覽器配置成使用代理功能時,防火墻就將你的瀏覽器的請求轉(zhuǎn)給互聯(lián)網(wǎng);當互聯(lián)網(wǎng)返回響應時,代理服務器再把它轉(zhuǎn)給你的瀏覽器。
  • 保護(Protect or Access)代理
    • 控制對一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用權限。

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

相關文章

  • Java命令設計模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護性

    Java命令設計模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護性

    本文介紹了Java命令設計模式,它將命令請求封裝成對象,以達到解耦命令請求和執(zhí)行者的目的,從而提高代碼可維護性。本文詳細闡述了該模式的設計原則、實現(xiàn)方法和優(yōu)缺點,并提供了實際應用場景和代碼示例,幫助讀者深入理解和應用該模式
    2023-04-04
  • eclipse漢化及jdk安裝環(huán)境配置超詳細教程(Java安裝教程)

    eclipse漢化及jdk安裝環(huán)境配置超詳細教程(Java安裝教程)

    這篇文章主要介紹了eclipse漢化及jdk安裝環(huán)境配置超詳細教程(Java安裝教程),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    深入探究一下Java中不同的線程間數(shù)據(jù)通信方式

    這篇文章主要來和大家一起深入探究一下Java中不同的線程間數(shù)據(jù)通信方式,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-04-04
  • 深入剖析Spring如何解決循環(huán)依賴

    深入剖析Spring如何解決循環(huán)依賴

    循環(huán)依賴(Circular?Dependency)是指兩個或多個Bean相互依賴,形成一個閉環(huán)的情況,本文將和大家深入探討一下Spring如何解決循環(huán)依賴,需要的可以參考下
    2025-04-04
  • IDEA編寫JavaWeb出現(xiàn)亂碼問題解決方案

    IDEA編寫JavaWeb出現(xiàn)亂碼問題解決方案

    這篇文章主要介紹了IDEA編寫JavaWeb出現(xiàn)亂碼問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 了解Java線程池創(chuàng)建過程

    了解Java線程池創(chuàng)建過程

    那么有沒有一種辦法使得線程可以復用,就是執(zhí)行完一個任務,并不被銷毀,而是可以繼續(xù)執(zhí)行其他的任務?在Java中可以通過線程池來達到這樣的效果。下面我們來詳細了解一下吧
    2019-05-05
  • 23種設計模式(20)java中介者模式

    23種設計模式(20)java中介者模式

    這篇文章主要為大家詳細介紹了23種設計模式之java中介者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java String 對象(你真的了解了嗎)

    Java String 對象(你真的了解了嗎)

    這篇文章主要介紹了Java String 對象(你真的了解了嗎),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 使用Java優(yōu)化設備壽命預測的5個關鍵技巧

    使用Java優(yōu)化設備壽命預測的5個關鍵技巧

    本文介紹了設備壽命管理領域的Java優(yōu)化實踐,通過調(diào)用Python、特征工程、緩存機制等技巧,提升了預測準確率和速度,減少了資源占用,實戰(zhàn)案例展示了如何避免調(diào)用陷阱、特征陷阱等問題,強調(diào)了優(yōu)化的重要性
    2026-05-05
  • 詳解Java設計模式編程中的Flyweight享元模式的開發(fā)結構

    詳解Java設計模式編程中的Flyweight享元模式的開發(fā)結構

    這篇文章主要介紹了Java設計模式編程中的Flyweight享元模式的開發(fā)結構,享元模式能夠最大限度地重用現(xiàn)有的同類對象,需要的朋友可以參考下
    2016-04-04

最新評論

宣恩县| 石家庄市| 中江县| 邓州市| 桂阳县| 城口县| 射阳县| 澎湖县| 忻州市| 诸暨市| 布尔津县| 柞水县| 抚顺县| 姚安县| 长乐市| 乌拉特中旗| 京山县| 伊吾县| 霞浦县| 汉源县| 彰化市| 蒙山县| 河北区| 文成县| 濮阳市| 弥勒县| 关岭| 天台县| 沅江市| 稻城县| 泽州县| 万载县| 连山| 金沙县| 镇远县| 黔西| 辽中县| 乌拉特中旗| 天等县| 浦县| 怀化市|