JDK代理必須要藉助一個接口才能產生代理對象。
定義接口:
public interface User {
void say(String str);
void haha();
}
定義接口實現類:
public class UserImp implements User {
@Override
public void say(String str) {
System.out.println("asd"+str);
}
@Override
public void haha() {
System.out.println("哈哈");
}
}
動態代理類(必須實現InvocationHandler接口的invoke方法 ):
public class JDKProxy implements InvocationHandler {
// 需代理的對象target
private Object target =null;
/*
* 獲取代理對象
* newProxyInstance方法的三個參數:
* 1. 需代理的對象的類加載器
* 2. 需代理的對象的接口(將代理對象掛在這個接口上)
* 3. 一個執行代理邏輯的對象(該對象必須實現InvocationHandler接口)
* */
public Object getProxy(Object obj){
target= obj;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
/*
* 執行代理邏輯,代理對象proxy(掛在User接口下)每調用接口方法時,都是通過調用invoke去調用。
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前的邏輯");
// 這裏執行真實的方法
Object obj = method.invoke(target, args);
System.out.println("代理後的邏輯");
return obj;
}
}
測試類:
/*
* JDK代理
* */
@Test
public void test(){
JDKProxy jdk = new JDKProxy();
// 產生代理對象
User proxy = (User)jdk.getProxy(new UserImp());
// 調用真實方法
proxy.haha();
proxy.say("asdasda");
}
結果:
false
代理前的邏輯
哈哈
代理後的邏輯
代理前的邏輯
asdasdasda
代理後的邏輯