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
代理后的逻辑