动态代理
public interface Animal { void eat(); void sleep(); }
public class Dog implements Animal { @Override public void eat() { System.out.println("Dog吃骨头"); } @Override public void sleep() { System.out.println("Dog睡觉"); } }
/** * * 代理模式: * 代理类和委托类 都有相同的接口!代理类 为 委托类做一些方法的处理! * 但是 真正执行的还是委托类中的代码!代理类之不过是在方法之前或者之后做了增强处理! * 代理类和委托类之间通常是有关系的! * * JDK动态代理: 必须要委托类 实现了接口 * InvocationHandler接口 位于 java.lang.reflect包下 * 该接口中 只有一个方法 * public Object invoke(Object proxy, Method method, Object[] args) * proxy:代理类 * method:被代理的方法 * args:方法中的参数数组 * * 想使用一个代理类 需要两个条件 * 01.实现 InvocationHandler接口 * 02.使用Proxy类 * public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) * loader:委托类的类加载器 * interfaces:得到委托类实现的所有接口 * h:InvocationHandler的实现类 */ public class MyProxy implements InvocationHandler{//代理类 //01.声明一个委托类对象 private Object target; //02.给我一个委托类,我返回给你一个代理类对象 public Object createProxyInstance(Object target){ this.target=target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //03.给方法 做增强 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("目标类方法执行之前......."); Object result = method.invoke(target, args); System.out.println("目标类方法执行之后......."); return result; } public static void main(String[] args) { //实例化代理对象 MyProxy proxy=new MyProxy(); //给我一个委托类,我返回给你一个代理类对象 Animal animal=(Animal) proxy.createProxyInstance(new Dog()); animal.eat(); System.out.println("***********"); animal.sleep(); } }