在 Java 開發中,有時候我們需要在運行時動態創建一個實現特定接口的類,而這個類的具體實現邏輯並非在編寫代碼時確定,而是通過一個統一的調用處理器來動態攔截和處理方法調用。這正是 Java 動態代理技術的核心價值所在。
動態代理的關鍵在於 InvocationHandler 接口,它只定義了一個方法:
Object invoke(Object proxy, Method method, Object[] args)
method.invoke(obj, args) 執行底層方法使用 Proxy.newProxyInstance 靜態方法即可生成代理實例:
Object proxy = Proxy.newProxyInstance(
null, // 類加載器,null 表示使用默認類加載器
interfaces, // 要實現的接口數組(即使只有一個接口也必須用數組)
handler // 實現了 InvocationHandler 的調用處理器實例
);
當在代理對象上調用任何接口方法時,JVM 會自動將調用轉發給 InvocationHandler.invoke() 方法,並將目標方法對象和實際參數傳遞進去。開發者可以在 invoke 中實現統一的邏輯,如日誌記錄、事務控制、權限檢查、遠程調用路由等。
Java 動態代理通過「接口 + 調用處理器」的模式,實現了運行時行為擴展,是 Spring AOP、RPC 框架、各類中間件的基石技術。掌握其原理與用法,能顯著提升框架設計與系統擴展能力。