1、基本原理
1.1 原理描述:使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行
1.2 涉及技术:代理、反射
1.3 局限性:必须基于接口实现
2、实践
2.1 定义接口及实现类
public interface Say {
void sayHello(String content);
void run(String content);
}
static class People implements Say {
@Override
public void sayHello(String content) {
System.out.println(content);
}
@Override
public void run(String content) {
System.out.println(content);
}
}
2.2 jdk动态代理实现逻辑
public class JDKDynamicProxy {
public static Object createProxy(final Object obj) {
return Proxy.newProxyInstance(JdkProxyTest.class.getClassLoader(),obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doBefore();
if (method.getName().equals("sayHello")) {
method.invoke(obj,args[0]);
doAfter();
}
return null;
}
});
}
static void doBefore() {
System.out.println("---before---");
}
static void doAfter() {
System.out.println("---after---");
}
}
2.3 测试动态代理
vm options:-verbose:class
public static void main(String[] args) {
Say p = new People();
p = (Say) JDKDynamicProxy.createProxy(p);
p.sayHello("liup");
p.run("gogogo"); // 测试执行接口所有方法,都会拦截
}