zoukankan      html  css  js  c++  java
  • Java

    package spring.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * TraceHandler 包装器类用来存储包装的对象
     * @author He
     *
     */
    public class TraceHandler implements InvocationHandler {
    
        private Object target;
        
        public TraceHandler(Object t) {
            this.target = t;
        }
        
        // 打印出被调用方法的名字和参数
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 输出代理对象名和方法名
            System.out.print(target + "." + method.getName() + "(");
            
            if (args != null) {
                for(int i = 0; i < args.length; ++i) {
                    System.out.print(args[i]);
                    if (i < args.length - 1) {
                        System.out.print(", ");
                    }
                }
            }
            System.out.println(")");
            
            return method.invoke(target, args);
        }
    
    }
    

      

    package spring.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    import java.util.Arrays;
    import java.util.Random;
    
    /**
     * 动态代理
     * 
     * 核心类:
     *     Proxy : 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
     *      提供一个实现了 InvocationHandler 接口的类对象
     *      
     *      创建对象 : Proxy.newProxyInstance(类加载器,Class对象数组,调用处理器)
     *     
     *     InvocationHandler : 是代理实例的调用处理程序 实现的接口
     *      每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法 
     *      接口中只有一个方法 : Object invoke(Object proxy, Method method, Object[] args)
     * 
     * @author 咖啡不苦
     */
    public class TestProxy {
    
        public static void main(String[] args) { 
            
            // 使用代理对象对二分查找进行追踪
            
            Object[] elements = new Object[1000];
            for (int i = 0; i < elements.length; ++i) {
                Integer value = i + 1;
                InvocationHandler handler = new TraceHandler(value);
                // 代理 Comparable 对象,null 表示使用默认的类加载器
                Object proxy = Proxy.newProxyInstance(null, new Class[] {Comparable.class}, handler);
                elements[i] = proxy;
            }
            
            Integer key = new Random().nextInt(elements.length) + 1;
            
            int result = Arrays.binarySearch(elements, key);
            
            if (result >= 0) {
                System.out.println(elements[result]);
            }
        
        }
    
    }
    /*
        输出结果:
        500.compareTo(481)
        250.compareTo(481)
        375.compareTo(481)
        437.compareTo(481)
        468.compareTo(481)
        484.compareTo(481)
        476.compareTo(481)
        480.compareTo(481)
        482.compareTo(481)
        481.compareTo(481)
        481.toString()
        481
     */ 
    

      

  • 相关阅读:
    Nginx下载服务器配置文件
    php7连接mysql测试代码
    Vagrant 构建 Linux 开发环境
    清理buffer/cache/swap的方法梳理
    【12】
    python全栈目录
    Chrome启动后打开第一个网页很慢的解决方案
    Pycharm快捷键
    TEst
    1、Linux命令随笔
  • 原文地址:https://www.cnblogs.com/kafeibuku/p/5280651.html
Copyright © 2011-2022 走看看