首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 代理模式深度解析:動態代理實現原理與實戰

     編輯:Java 相關知識

代理模式生活實例

手機廠商有代理商,歌星有經紀人,董事長出差由秘書代為結帳——這些都是代理模式。

靜態代理示例

1. 定義接口

public interface Merchant {
    void treat(); // 請客吃飯
}

2. 目標對象:董事長

public class Director implements Merchant {
    public void treat() { System.out.println("董事長請大家吃飯"); }
}

3. 代理對象:秘書(實現 InvocationHandler)

public class Secretary implements InvocationHandler {
    private Director director;
    public Secretary(Director director) { this.director = director; }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        director.treat();          // 目標業務
        System.out.println("由秘書結帳咯!"); // 代理增強
        return null;
    }
}

動態代理生成與測試

public class ProxyTest {
    public static void main(String[] args) {
        Director director = new Director();
        InvocationHandler secretary = new Secretary(director);
        // 生成代理實例
        Merchant merchant = (Merchant) Proxy.newProxyInstance(
            director.getClass().getClassLoader(),
            director.getClass().getInterfaces(),
            secretary
        );
        merchant.treat(); // 調用代理方法
    }
}

運行結果

董事長請大家吃飯
由秘書結帳咯!

核心機制解析

  1. Proxy.newProxyInstance:為目標對象創建代理類(如 $Proxy0),實現目標所有接口
  2. InvocationHandler.invoke:代理方法調用統一委派給此方法,類似事件監聽機制
  3. 第三個參數:相當於為代理對象註冊監聽器

關鍵點總結

  • 代理類運行時動態生成,無需預先定義
  • 目標類必須實現接口(JDK 動態代理基於接口)
  • 適用於 AOP、事務管理、日誌記錄、權限控制等橫切關注點
  • CGLIB 可代理無接口類(通過繼承)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved