在 Java 開發中,有時候我們需要在運行時動態創建一個類,該類實現一組預先定義的介面。這時,Java 內建的動態代理機制便派上用場。它允許開發者在程式執行期間,根據指定的介面生成全新的類別,而無需在編譯期預先定義具體實現類。
代理類本身不包含具體的業務邏輯,而是將方法調用委派給一個實現了 InvocationHandler 介面的調用處理器。該介面僅定義一個核心方法:
Object invoke(Object proxy, Method method, Object[] args)
Method 對象。開發者需在 invoke 方法中編寫統一的攔截邏輯,如日誌記錄、事務管理、權限檢查等。
使用 Proxy.newProxyInstance() 靜態方法即可生成代理對象:
Object proxy = Proxy.newProxyInstance(
ClassLoader loader, // 類加載器,通常傳 null 使用系統預設
Class>[] interfaces, // 目標介面陣列(即使只有一個介面也需用陣列)
InvocationHandler handler // 調用處理器實例
);
proxy.doSomething())。InvocationHandler.invoke()。invoke 中執行前置邏輯,隨後可選擇通過 method.invoke(target, args) 調用真實目標對象,或直接返回自定義結果。將目標對象包裝為代理,在 invoke 中記錄方法名、參數、耗時、異常堆疊,實現無侵入式的 AOP 風格監控。
代理端負責序列化參數、網絡通訊、反序列化結果,屏蔽網絡細節,讓調用者如同呼叫本地方法。
類似 C# 的委派機制,將界面組件的事件(點擊、輸入等)動態綁定到處理器方法,減少樣板代碼。
Method 對象或改用字節碼生成方案。invoke 拋出的受檢異常必須聲明在目標介面方法的 throws 子句中,否則會拋出 UndeclaredThrowableException。Java 動態代理是實現橫切關注點、構建框架基礎設施(如 Spring AOP、RPC 框架)的核心技術。掌握其原理與用法,能讓你在設計靈活、可擴展的系統時得心應手。