代理模式简介
1、静态代理:(1)先定义一个接口,确定需要实现的方法;(2)创建代理类和具体的被代理类,这两个类都需要实现这个接口;(3)在代理类的构造方法中传递过来被代理类的实例,这样就可以获取到被代理类,在代理类实现的接口方法中可以调用被代理类的实现方法,同时还可以在代理类中加别的方法;这就是静态代理的基本流程。
2、动态代理:jdk动态代理,只能为接口创建代理,在运行时实现的,其中主要的是一个InVocationHandler:

demo测试一下:
(1)定义一个接口:
public interface Animal {
void eat();
}
(2)创建具体的对象:
public class Tigerimplements Animal{
private static final StringTAG ="Tiger";
@Override
public void eat() {
System.out.println("eat tiger");
}
}
(3)具体的代理类实现上面说的一个接口:
public class Proxy implements InvocationHandler {
private static final StringTAG ="Proxy";
private Objecttarget;
public Proxy(Object target) {
this.target = target;
}
/**
* @param proxy 真是对象的代理
* @param method 真是对象的方法
* @param objects 代理真是对象的某个方法的参数
* @return
* @throws Throwable
*/
@Override
public Objectinvoke(Object proxy, Method method, Object[] objects)throws Throwable {
//此处打印一些东西
System.out.println("proxy: " + proxy.getClass().getName());
System.out.println("before: ");
method.invoke(target, objects);
System.out.println("after: ");
return null;
}
}
(4)main方法调用:
public static void main(String[] args) {
Animal tiger =new Tiger();
Proxy proxy =new Proxy(tiger);
//通过反射获得真是的代理对象
Animal animal = (Animal) java.lang.reflect.Proxy.newProxyInstance(tiger.getClass().getClassLoader(),
tiger.getClass().getInterfaces(), proxy);
//通过代理对象调用真实的方法,这时候会调用Proxy类的invoke方法
animal.eat();
//获得真是对象的代理对象岁对应的class对象的名称
System.out.println("main: " + animal.getClass().getName());
}
执行完成后的结果:
