动态代理

public interface Animal {
    
    void  eat();
    void  sleep();
    

}
Animal接口
public class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("Dog吃骨头");
    }

    @Override
    public void sleep() {
        System.out.println("Dog睡觉");
    }

}
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();
    }

}
自定义代理类以及测试方法
原文地址:https://www.cnblogs.com/999-/p/6061407.html