CGlib: 動態代理之王

一、cglib可以代理接口嗎

答案是不能。

CGlib是針對類來實現代理的,它的原理是通過字節碼處理框架ASM來轉換字節碼並生成新的類。

二、cglib需要接口來做代理嗎

答案是不需要。

相比於JDK的動態代理,CGlib無需被代理對象實現接口,動態生成的子類重寫父類的方法,因此可以代理沒有實現任何接口的類。

三、cglib全稱

CGlib全稱是Code Generation Library,是一個強大的高性能代碼生成類庫,它可以在運行期擴展Java類與實現Java接口。

四、cglib和jdk代理的區別

CGlib相對於JDK動態代理的優勢是:

1. CGlib可以代理沒有接口實現的類

2. CGlib基於ASM字節碼處理庫,運行時代理速度快

3. JDK動態代理是基於接口的,所以只能代理接口的方法,無法代理對象的屬性,而CGlib是代理類的方法,可以代理類的屬性,實現代理類的繼承

4. JDK動態代理由於是使用反射機制來執行被代理對象的方法,所以在高並發的情況下性能受到影響,而CGlib通過生成字節碼的方式來實現動態代碼的執行,所以性能更好一些。

五、cglib怎麼讀

CGlib的英文全稱是 Code Generation Library,中文名是基因代碼庫。

CGlib讀作:[si: dʒi:l’ɪb]。

六、cglib動態代理


public class UserDao {
    public void save(){
        System.out.println("----已經保存數據----");
    }
}

public class CglibProxy implements MethodInterceptor {
    private Object target;
    public Object getInstance(Object target){
        this.target=target;
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("執行前。。。。。。。。。。");
        Object obj=method.invoke(target,objects);
        System.out.println("執行後。。。。。。。。。。");
        return obj;
    }
}

public class TestCglib {
    public static void main(String[] args) {
        UserDao userDao=new UserDao();
        CglibProxy cglibProxy=new CglibProxy();
        UserDao proxy = (UserDao) cglibProxy.getInstance(userDao);
        proxy.save();
    }
}

七、cglib 代理

CGlib代理的基本步驟如下:

1. 繼承需要被代理的類

2. 重寫需要被攔截的方法,實現增強邏輯

3. 在需要使用代理的地方,使用代理類代理原有類

八、cglib代理屬性

CGlib代理類可以攔截方法以及屬性,使用起來也非常的靈活。

九、cglib創建對象


// 創建類
Enhancer enhancer = new Enhancer();
// 為該類設置父類
enhancer.setSuperclass(MyClass.class);
// 設置回調接口對象
enhancer.setCallback(new MyInterceptor());
// 創建子類實例
MyClass myClass = (MyClass) enhancer.create();

十、cg禮包絕跡是什麼

本文講解的CGlib與cg禮包絕跡無關。

原創文章,作者:SQAUA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/330744.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SQAUA的頭像SQAUA
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • QML 動態加載實踐

    探討 QML 框架下動態加載實現的方法和技巧。 一、實現動態加載的方法 QML 支持從 JavaScript 中動態指定需要加載的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • 使用easypoi創建多個動態表頭

    本文將詳細介紹如何使用easypoi創建多個動態表頭,讓表格更加靈活和具有可讀性。 一、創建單個動態表頭 easypoi是一個基於POI操作Excel的Java框架,支持通過註解的…

    編程 2025-04-28
  • Python動態輸入: 從基礎使用到應用實例

    Python是一種高級編程語言,因其簡單易學和可讀性而備受歡迎。Python允許程序員通過標準輸入或命令行獲得用戶輸入,這使得Python語言無法預測或控制輸入。在本文中,我們將詳…

    編程 2025-04-28
  • Python動態規劃求解公共子串

    本文將從以下多個方面對公共子串Python動態規划進行詳細闡述: 一、什麼是公共子串? 公共子串是指在兩個字符串中同時出現且連續的子串。例如,字符串”ABCD&#822…

    編程 2025-04-27
  • 使用Thymeleaf動態渲染下拉框

    本文將從下面幾個方面,詳細闡述如何使用Thymeleaf動態渲染下拉框: 一、Thymeleaf是什麼 Thymeleaf是一款Java模板引擎,可用於Web和非Web環境中的應用…

    編程 2025-04-27
  • 動態規劃例題用法介紹

    本文將以動態規劃(Dynamic Programming, DP)例題為中心,深入闡述動態規劃的原理和應用。 一、最長公共子序列問題 最長公共子序列問題(Longest Commo…

    編程 2025-04-27
  • IPv6動態域名解析的實現和應用

    一、IPv6的動態域名解析概述 IPv6是下一代互聯網協議,解決了IPv4中IP地址不足的問題。IPv6的地址長度為128位,地址空間巨大,同時支持更多的安全和網絡管理特性。動態域…

    編程 2025-04-25
  • Bandit算法——讓機器學會動態決策

    一、什麼是Bandit算法 Bandit算法是通過不斷嘗試並學習結果來達到最優決策的一種算法。它屬於強化學習的範疇,主要應用於動態決策問題中,例如推薦系統、廣告投放等領域。 以廣告…

    編程 2025-04-24

發表回復

登錄後才能評論