zoukankan      html  css  js  c++  java
  • 动态代理

    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();
        }
    
    }
    自定义代理类以及测试方法
  • 相关阅读:
    第三章 系统总线
    人工神经网络及其应用
    专家系统
    遗传算法
    搜索算法策略
    js判断有无属性及新添属性
    vue 文件插件 Vetur 设置说明官网
    vue 获得当前无素并做相应处理
    VUE style 绑定
    vue入门基础知识点测试
  • 原文地址:https://www.cnblogs.com/999-/p/6061407.html
Copyright © 2011-2022 走看看