代理模式:给对象提供一个代理,并由代理对象控制对原对象的引用。
创建接口类:Person
public interface Person {
void run();
}
创建实现类:LaoWang,实现run方法
public class LaoWang implements Person {
@Override
public void run() {
System.out.println("老王翻墙跑路。。。。。");
}
}
创建动态代理类:JDKDynamicProxy
JDKDynamicProxy():构造函数初始化原对象Person;
getInstance():根据Person对象创建代理对象并返回;
invoke():实现InvocationHandler,重写invoke方法(被代理对象每次执行的都是invoke方法)
public class JDKDynamicProxy implements InvocationHandler {
//被代理对象
private Person person;
//构造函数
public JDKDynamicProxy(Person person) {
this.person = person;
}
//获取代理对象
public Object getInstance() {
Object o = Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
return o;
}
//代理对象真正执行的是invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置增强:老王夺门而出");
Object invoke = method.invoke(person, args);
System.out.println("后置增强:老王摔个狗啃泥");
return invoke;
}
}
测试(对比使用与不使用动态代理的区别)及打印结果:
public class ProxyTest {
public static void main(String[] args) {
System.out.println("不使用动态代理:");
LaoWang laoWang = new LaoWang();
laoWang.run();
System.out.println("-----------分割线-------------");
System.out.println("使用动态代理:");
//生成Person的代理对象
Person proxy = (Person) new JDKDynamicProxy(new LaoWang()).getInstance();
proxy.run();
}
}