Java的動態代理需要一個InvocationHandler實例,這個實例就是代理處理程序。
這個接口中有一個方法:
Objectinvoke(Object proxy,
Method method,
Object[] args)
throws Throwable在代理實例上處理方法調用並返回結果。在與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法。
參數:proxy - 在其上調用方法的代理實例method - 對應於在代理實例上調用的接口方法的 Method 實例。Method 對象的聲明類將是在其中聲明方法的接口,該接口可以是代理類賴以繼承方法的代理接口的超接口。args - 包含傳入代理實例上方法調用的參數值的對象數組,如果接口方法不使用參數,則為 null。基本類型的參數被包裝在適當基本包裝器類(如 java.lang.Integer 或 java.lang.Boolean)的實例中。 返回:從代理實例的方法調用返回的值。如果接口方法的聲明返回類型是基本類型,則此方法返回的值一定是相應基本包裝對象類的實例;否則,它一定是可分配到聲明返回類型的類型。如果此方法返回的值為 null 並且接口方法的返回類型是基本類型,則代理實例上的方法調用將拋出 NullPointerException。否則,如果此方法返回的值與上述接口方法的聲明返回類型不兼容,則代理實例上的方法調用將拋出 ClassCastException。 拋出:Throwable - 從代理實例上的方法調用拋出的異常。該異常的類型必須可以分配到在接口方法的 throws 子句中聲明的任一異常類型或未經檢查的異常類型 java.lang.RuntimeException 或 java.lang.Error。如果此方法拋出經過檢查的異常,該異常不可分配到在接口方法的 throws 子句中聲明的任一異常類型,代理實例的方法調用將拋出包含此方法曾拋出的異常的 UndeclaredThrowableException。另請參見:UndeclaredThrowableException
第一個參數proxy看著太迷惑了。寫代碼根本用不上!!!!
寫了一個簡單的接口實現方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前執行的操作!");
method.invoke(sub, args);
System.out.println("代理後執行的操作!");
return null;
}
實際上,根本用不到第一個參數。
不知道設計這個方法的人怎麼搞的,api文檔也說得很玄乎,我就直接忽略了。反正也沒用。
歡迎探討。