/**
*
* 代理模式:
* 代理类和委托类 都有相同的接口!代理类 为 委托类做一些方法的处理!
* 但是 真正执行的还是委托类中的代码!代理类之不过是在方法之前或者之后做了增强处理!
* 代理类和委托类之间通常是有关系的!
*
* 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();
}
}