在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JDK動態代理的原理

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 10:51 ? 次閱讀

Java中,動態代理是一種機制,允許在運行時動態地創建代理對象來代替某個實際對象,從而在其前后執行額外的邏輯。

為什么JDK動態代理只能代理接口實現類,原因是JDK動態代理是基于接口實現的。

當你使用Proxy類創建代理對象時,你需要指定一個接口列表來表示代理對象所應該實現的接口,這些接口就成為代理對象的類型。

具體來說,代理對象的方法調用會被轉發到實現InvocationHandler接口的類中的invoke()方法。這個invoke()方法接受三個參數:代理對象本身、被調用的方法對象和方法的參數數組。invoke()方法需要返回被代理方法調用的結果。

由于代理對象的類型是由接口列表決定的,因此只有實現了接口的類才能被代理。如果你想代理一個類而不是一個接口,你需要使用其他的代理技術,比如CGLIB。

1、JDK動態代理代碼實例

下面是一個簡單的示例代碼,展示了如何使用JDK動態代理來創建代理對象。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyDemo {
    public static void main(String[] args) {
        RealObject real = new RealObject();
        InvocationHandler handler = new DynamicProxy(real);

        // 創建代理對象
        MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
                MyInterface.class.getClassLoader(),
                new Class< ? >[] { MyInterface.class },
                handler);

        // 調用代理對象的方法
        proxy.doSomething();
    }
}

interface MyInterface {
    void doSomething();
}

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

class DynamicProxy implements InvocationHandler {
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("Before method invocation");
        Object result = method.invoke(target, args);
        System.out.println("After method invocation");
        return result;
    }
}

在上面的代碼中,RealObject實現了MyInterface接口,它是我們要代理的實際對象。DynamicProxy類實現了InvocationHandler接口,并在invoke()方法中添加了額外的邏輯,用于在代理對象方法調用前后執行。

main()方法中,我們使用Proxy.newProxyInstance()方法創建代理對象。我們指定了MyInterface接口作為代理對象類型,并將DynamicProxy對象作為代理對象的InvocationHandler

最后,我們調用代理對象的doSomething()方法,并觀察控制臺輸出的結果。

需要注意的是,代理對象的方法調用都會被轉發到DynamicProxy類的invoke()方法中進行處理,因此在這個示例中,實際的RealObject對象的doSomething()方法的執行是在invoke()方法中通過反射進行的。

總結一下,JDK動態代理只能代理接口實現類,原因是JDK動態代理是基于接口實現的,代理對象的類型由接口列表決定。如果你想代理一個類而不是一個接口,你需要使用其他的代理技術,比如CGLIB。

2、Cglib 代碼演示

以下是CGLIB代理的示例代碼。

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CGLIBProxyDemo {
    public static void main(String[] args) {
        RealObject real = new RealObject();
        MethodInterceptor handler = new CGLIBProxy(real);

        // 創建代理對象
        RealObject proxy = (RealObject) Enhancer.create(
                RealObject.class,
                handler);

        // 調用代理對象的方法
        proxy.doSomething();
    }
}

class CGLIBProxy implements MethodInterceptor {
    private Object target;

    public CGLIBProxy(Object target) {
        this.target = target;
    }

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method invocation");
        Object result = proxy.invoke(target, args);
        System.out.println("After method invocation");
        return result;
    }
}

在上面的示例中,我們使用CGLIB的Enhancer類和MethodInterceptor接口來創建代理對象。RealObject類不再需要實現接口,而是直接作為代理對象的類型。在CGLIBProxy類中,我們實現了MethodInterceptor接口,并在intercept()方法中添加了額外的邏輯。

main()方法中,我們使用Enhancer.create()方法創建代理對象。我們指定了RealObject類作為代理對象類型,并將CGLIBProxy對象作為代理對象的MethodInterceptor。最后,我們調用代理對象的doSomething()方法,并觀察控制臺輸出的結果。

需要注意的是,CGLIB代理使用字節碼技術來生成代理對象,因此它的效率比JDK動態代理要高,但是它也需要額外的庫依賴。

3、兩者優缺點

JDK動態代理和CGLIB代理都有它們自己的優缺點。

JDK動態代理的優點:

  • JDK動態代理是Java標準庫的一部分,因此它不需要引入任何外部依賴。
  • JDK動態代理只需要實現接口即可生成代理對象,不需要改變原有類的結構。
  • 由于JDK動態代理是基于接口實現的,因此它更適合用于代理接口實現類的場景。

JDK動態代理的缺點:

  • JDK動態代理只能代理實現了接口的類,無法代理沒有實現接口的類。
  • JDK動態代理在生成代理對象時,需要使用反射機制,因此它的效率相對較低。

CGLIB代理的優點:

  • CGLIB代理是基于字節碼技術實現的,因此它的效率比JDK動態代理更高。
  • CGLIB代理可以代理沒有實現接口的類。

CGLIB代理的缺點:

  • CGLIB代理需要引入外部依賴。
  • CGLIB代理在生成代理對象時,需要改變原有類的結構,因此它可能會引起一些問題,例如無法代理final類或final方法等問題。

綜上所述,JDK動態代理適用于代理接口實現類的場景,而CGLIB代理適用于代理沒有實現接口的類的場景。如果你需要代理接口實現類,而且不想引入額外的依賴,那么JDK動態代理是一個不錯的選擇;如果你需要代理沒有實現接口的類,那么CGLIB代理可能更適合你的需求。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8848

    瀏覽量

    152804
  • 代理
    +關注

    關注

    1

    文章

    44

    瀏覽量

    11278
  • 數組
    +關注

    關注

    1

    文章

    419

    瀏覽量

    26241
  • JDK
    JDK
    +關注

    關注

    0

    文章

    82

    瀏覽量

    16752
收藏 人收藏

    評論

    相關推薦

    javaassit如何實現代對目標類的代理

    語言,更是一門面向切面的編程語言,正是這個特性,讓Java更加地靈活。 可能你寫過基于Spring AOP的代碼,其原理都是基于JDK動態代理或者CGLIB來實現,其局限性在于我們只能以方法作為連接點,來實現基于方法執行過程的
    的頭像 發表于 09-25 11:18 ?1063次閱讀
    javaassit如何實現代對目標類的<b class='flag-5'>代理</b>

    Java自學教程SSM框架全覆蓋day9_04-aop簡介-基于jdk動態代理

    JAVA
    電子學習
    發布于 :2023年01月08日 19:44:12

    JDK的安裝、環境配置及使用

    :Windows下,直接運行exe文件,安裝到一個目錄,例如將其安裝到C:\jdk1.5目錄下面。安裝后,其中lib目錄下面保存的是java庫文件,bin目錄是一些執行文件和動態連接庫文件,demo目錄
    發表于 12-06 00:19

    java jdk6.0官方下載

    java jdk6.0下載如何件: java jdk6.0安裝步驟: 第一步 JDK1.6的安裝步驟 第一步雙擊安裝文件jdk-6u7-windows-i586-p.exe
    發表于 10-17 11:47 ?155次下載
    java <b class='flag-5'>jdk</b>6.0官方下載

    java的動態代理機制和作用

    的我們的功能,我們更需要學習的是其底層是怎么樣的一個原理,而AOP的原理就是java的動態代理機制,所以本篇隨筆就是對java的動態機制進行一個回顧。 在java的動態
    發表于 09-27 14:37 ?0次下載

    java動態代理分析

    定義:為其他對象提供一種代理以控制對這個對象的訪問。 動態代理使用 java動態代理機制以巧妙的方式實現了
    發表于 09-27 15:14 ?0次下載

    java的動態代理

    代理模式是常用的java設計模式,他的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。代理類與委托類之間通常會存在
    發表于 03-12 14:12 ?0次下載

    基于JDK和CGLB分別實現的動態代理

    本文檔內容介紹了基于JDK和CGLB分別實現的動態代理及源代碼
    發表于 03-12 14:56 ?0次下載

    什么是動態ip代理電腦軟件?

    動態IP代理計算機軟件是計算機瀏覽器和Web群集服務器之間的網絡服務器。如果使用動態IP代理計算機軟件訪問Internet,則計算機瀏覽器不會立即轉到Web網絡服務器來檢索網頁,而是僅
    發表于 01-14 18:06 ?1031次閱讀
    什么是<b class='flag-5'>動態</b>ip<b class='flag-5'>代理</b>電腦軟件?

    Python爬蟲:工作者常用的動態IP代理

    爬蟲工作者應該經常要與代理ip工具打交道,根據不同的抓取網站,大家要調用不同類型的動態ip代理
    的頭像 發表于 06-28 16:29 ?3473次閱讀

    淺談字節碼增強技術系列2-Asm與Cglib

    Spring AOP 的實現原理是基于動態織入的動態代理技術,而動態代理技術又分為 Java JDK
    的頭像 發表于 12-20 10:03 ?830次閱讀

    mybatis接口動態代理原理

    MyBatis是一款輕量級的Java持久化框架,它通過XML或注解配置的方式,將數據庫操作與SQL語句解耦,提供了一種簡單、靈活的數據訪問方式。在MyBatis中,使用動態代理技術來實現接口的代理
    的頭像 發表于 12-03 11:52 ?1091次閱讀

    weblogic修改jdk路徑

    WebLogic是一個流行的Java應用服務器,可以用于部署和管理企業級Java應用程序。在WebLogic的安裝和配置過程中,我們可能會遇到需要修改JDK(Java Development Kit
    的頭像 發表于 12-05 14:46 ?1538次閱讀

    如何配置jdk的環境變量

    配置JDK的環境變量是在操作系統中設置一些路徑,以便能夠在命令提示符或終端中全局運行Java開發工具。這樣,您可以在任何位置運行Java程序。 以下是一步一步的指南來配置JDK的環境變量。 第一步
    的頭像 發表于 12-06 15:07 ?994次閱讀

    在實際開發中,動態代理技術都是如何應用的?

    動態代理技術因其靈活性和強大的功能,在軟件開發中被廣泛應用,特別是在需要在運行時動態地改變對象行為的場景中。
    的頭像 發表于 09-23 07:46 ?301次閱讀
    主站蜘蛛池模板: 俺也啪 | 最近2018年在线中文字幕高清 | 天堂网在线www资源网 | 四虎精品成在线播放 | 日本aaaaa特黄毛片 | 美女一级牲交毛片视频 | 成人夜色视频网站在线观看 | 国产精品福利一区 | 黄色网日本 | ts人妖另类国产 | 免费a级网站 | 三级视频在线播放线观看 | 国产激烈床戏无遮挡观看 | 看全黄大片狐狸视频在线观看 | 99久久国产综合精品国 | 男人扒开美女尿口无遮挡图片 | 免费黄色大片视频 | 在线观看视频你懂得 | 午夜毛片网站 | 性夜影院爽黄e爽在线观看 羞羞色院91精品网站 | 在线日本人观看成本人视频 | 在线麻豆国产传媒60在线观看 | 欧美一级鲁丝片 | 欧美日韩一区二区三区视视频 | 1024你懂的国产精品 | 天天干天天摸天天操 | 欧美性色欧美a在线观看 | 亚洲成网站www久久九 | 78m-78模成视频在线 | 在线视频永久在线视频 | 美国一级毛片片aa久久综合 | 在线网站黄 | 精品xxxxxbbbb欧美中文 | 国产自在自线午夜精品视频在 | 97狠狠操 | 狠狠色丁香婷婷综合激情 | 午夜69成人做爰视频网站 | 伊人五月婷婷 | 四虎国产精品永久地址51 | 亚洲4区| 免费手机黄色网址 |