直觀理解JAVA動態代理

動態代理:

概念:

依賴被代理對象B的字節碼信息,創建代理對象A,用戶對B的任意方法訪問必須經過A的處理。該方法實現了用戶與B類的隔離,在不修改源碼的基礎上(無侵入式的代碼擴展),對被代理對象的方法進行增強。

簡單點說就是,你作爲大臣遞給皇上的奏章,都被慈禧(代理對象)先看一遍並批改一下,才能給真正的皇上看(被代理對象)。

實現方法分類:

  • 基於接口的動態代理

    依賴類:Proxy(JDK官方)

    使用條件:被代理對象B至少實現一個接口,否則不能使用

    使用方法:使用Proxy類中的newProxyInstance方法,根據B類字節碼創建代理類A;

    newProxyInstance方法的參數

    • ClassLoader:用於加載被代理對象字節碼中的類加載器,固定寫法,xx.getClass().getClassLoader();
    • Class[]:字節碼數組,用於讓代理對象和被代理對象有相同的方法,固定寫法,xx.getClass().getInterfaces();
    • InvocationHandler:用於提供增強的代碼,匿名內部類InvocationHandler,覆寫invoke()(這個函數就是下圖中的紅色菱形);

    便於理解的示意圖:

在這裏插入圖片描述
在這裏插入圖片描述

  • 基於子類的動態代理

    依賴類:Enhancer(cglib第三方庫)

    使用條件:被代理對象B不能是final

    使用方法:使用Enhancer類中的create方法,根據B類字節碼創建代理類A

    create方法的參數

  • Class:被代理類B的字節碼,固定寫法,xx.getClass();

  • Callback:用於提供增強的代碼,使用匿名類MethodInterceptor,覆寫intercept()方法

原理圖同上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章