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();
        }
    
    }
    自定义代理类以及测试方法
  • 相关阅读:
    edgeR
    R中的运算符,条件语句,控制语句
    library-type:fr-unstanded vs fisrt-stand vs second-stanrd
    R的几个基础函数
    HTseq-count
    HISAT2的运用
    shell的符号总结
    python-tuple
    python -List
    win10 ubuntu18.0 LTS双系统安装
  • 原文地址:https://www.cnblogs.com/999-/p/6061407.html
Copyright © 2011-2022 走看看