Java - 动态代理
2016-03-15 18:42
417 查看
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 */
相关文章推荐
- java作业之输入十个学生的成绩求平均分。。。
- Java - 反射机制 2
- Eclipse控制台输出信息的控制
- spring mybatis整合读取配置文件
- MyEclipse 生成APK文件
- java作业之输出1-100只能能被3整除的前5个整数。。。
- Struts2 Hibernate Spring 整合的基本流程和步骤及其相关配置细节
- 在Java中谈尾递归--尾递归和垃圾回收的比较
- java作业源代码。。。
- 蓝桥杯2013年java—A组第七题
- Elasticsearch源码加载到eclipse调试
- Ubuntu16.04安装Eclipse EE
- java.io.Serializable浅析
- 关于[Ljava.lang.String;@1ec4536的问题
- struts2实现条件查询分页代码
- 如果把JAVA EE项目打成war包,上传到服务器!
- Java的synchronized使用
- 20145235 学号 《Java程序设计》第2周学习总结
- Java基础之常见问题
- 深入学习微框架:Spring Boot