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 */