一、基本概念
Java 動態代理 有兩個重要的類和接口InvocationHandler
(接口)和Proxy
(類),這一個類Proxy
和接口InvocationHandler
是我們實現動態代理的核心;
InvocationHandler
接口是proxy
代理實例的調用處理程序實現的一個接口,每一個proxy
代理實例都有一個關聯的調用處理程序;
在代理實例調用方法時,方法調用被編碼分派到調用處理程序的invoke
方法
每一個動態代理類的調用處理程序都必須實現InvocationHandler
接口,並且每個代理類的實例都關聯到了實現該接口的動態代理類調用處理程序中,當我們通過動態代理對象調用一個方法時候,這個方法的調用就會被轉發到實現InvocationHandler
接口類的invoke方法來調用
二、示例一
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//定義接口
interface Shopping {
String buy();
}
//定義接口實現類 Client
class Client implements Shopping {
public String buy() {
System.out.println("我想買這件商品");
return "那就買它!!!";
}
}
//代理操作類
class DynamicProxy implements InvocationHandler {
private Object target = null;
DynamicProxy(Object target) {
this.target = target;
}
/**
* 代理方法邏輯
*
* @param proxy 代理對象
* @param method 調度方法
* @param args 調度方法參數
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
Object invoke = method.invoke(target, args);
System.out.println("代理後");
return invoke;
}
}
public class ProxyTest {
public static void main(String[] args) {
Shopping client = new Client();
//實例化代理操作類
DynamicProxy dyProxy = new DynamicProxy(client);
//獲取動態代理對象 shop
Shopping shop = (Shopping) Proxy.newProxyInstance(Shopping.class.getClassLoader(), new Class[]{Shopping.class}, dyProxy);
System.out.println(shop.buy());
}
}
代碼執行的流程就是
(1)獲取動態代理對象 shop
(2)調用shop 的方法 buy ,這會轉發到 DynamicProxy
的invoke
方法內調用,這裏的 invoke
實際上就是對轉發的方法的進行的操作,這裏的操作時繼續轉發 method.invoke
,當然還可以有其他的操作。
三、示例二
這裏的invoke
就是一個封裝參數,然後轉發到Executor
的操作
四、method.invoke
method.invoke
實現的是對方法的轉發執行
示例可 點擊參考