JDK動態代理實現
代理模式是設計模式中比較重要也比較常用的模式,靜態代理靠我們手工完成代理類,這是一項比較耗時和費力的工作,一旦被代理介面發生改變需要修改的地方也比較多。但是動態代理就不會產生這樣的後遺症。java動態代理的出現,只要簡單地指定一組介面及委託類物件,便能動態地獲得代理類。
我們來看一下相關的類和介面:
1.java.lang.reflect.Proxy:這是 Java 動態代理機制的主類,它提供了一組靜態方法來為一組介面動態地生成代理類及其物件。
// 方法 1: 該方法用於獲取指定代理物件所關聯的呼叫處理器
static InvocationHandler getInvocationHandler(Object proxy)
// 方法 2:該方法用於獲取關聯於指定類裝載器和一組介面的動態代理類的類物件
static Class getProxyClass(ClassLoader loader, Class[] interfaces)
// 方法 3:該方法用於判斷指定類物件是否是一個動態代理類
static boolean isProxyClass(Class cl)
// 方法 4:該方法用於為指定類裝載器、一組介面及呼叫處理器生成動態代理類例項
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
2.java.lang.reflect.InvocationHandler:這是呼叫處理器介面,它自定義了一個 invoke 方法,用於集中處理在動態代理類物件上的方法呼叫,通常在該方法中實現對委託類的代理訪問。
/ 該方法負責集中處理動態代理類上的所有方法呼叫。第一個引數既是代理類例項, 第二個引數是被呼叫的方法物件
// 第三個方法是呼叫引數。呼叫處理器根據這三個引數進行預處理或分派到委託類實 例上發射執行
Object invoke(Object proxy, Method method, Object[] args)
3.java.lang.ClassLoader:這是類裝載器類,負責將類的位元組碼裝載到
java動態代理的實現步驟:
1 通過實現 InvocationHandler 介面建立自己的呼叫處理器;
2 通過為 Proxy 類指定 ClassLoader 物件和一組 interface 來建立動態代理類;
3 通過反射機制獲得動態代理類的建構函式,其唯一引數型別是呼叫處理器介面型別;
4 通過建構函式建立動態代理類例項,構造時呼叫處理器物件作為引數被傳入。