简单的代理类实现案例
主实现类:ProxyTest
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Random;
//为什么需要代理类?因为在实际情况下,我们要构建实现了某些接口的新类,但是我们不知道原始的对象确切类型是什么,另外接口又不能生成实例,有两种解决办法:
//方法一:通过反射,找到这个类的构造器,但是不能实例化一个接口,因此需要在程序运行时动态地定义一个新类
//方法二:创建代理对象(代理对象只有一个实例域:handler 这个对象包装了实际的对象,也就是使被包装的对象是实现接口的功能)
public class ProxyTest {
public static void main(String[] args) {
Object[] elements = new Object[10];
for(int i=0;i< elements.length;i++){
Integer value = i+1;
InvocationHandler handler = new TraceHandler(value);
// 构造一个代理实例(参数1 类加载器;参数2 接口类对象数组;参数3 调用处理器)
Object proxy = Proxy.newProxyInstance(null,new Class[]{Comparable.class},handler);
elements[i] = proxy;
}
//构造一个随机数
Integer key = new Random().nextInt(elements.length)+1;
//寻找key
int result = Arrays.binarySearch(elements,key);
//如果找到了就打印出来
if(result>=0) System.out.println(elements[result]);
}
}

辅助类:TraceHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TraceHandler implements InvocationHandler {
private Object target;
public TraceHandler(Object t){
target = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print(target);
System.out.print("."+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);
}
}
参考:java基础技术卷1
 

最新文章

  1. Winform无边框窗体的移动和阴影
  2. onSaveInstanceState(Bundle outState)的调用时机
  3. mybatis sql in 查询(mybatis sql语句传入参数是list)mybatis中使用in查询时in怎么接收值
  4. 毕向东JAVA视频讲解笔记(前三课)
  5. js事件汇总
  6. Ubuntu14.04和16.04官方默认更新源sources.list和第三方源推荐(干货!)
  7. Tomcat搭建Web 应用服务器
  8. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
  9. 记录entityframework生成的sql语句
  10. GBDT-梯度提升树
  11. DPDK(mtcp)vs RDMA/ROCE
  12. Centos6.5搭建dhcpd服务
  13. PhpStorm提高效率的使用方法及设置(快捷键)
  14. 团队项目成员与题目(本地地铁查询app)
  15. JS根据userAgent值来判断浏览器的类型及版本【转】
  16. 关于js中的取值问题
  17. JDK8 新特性
  18. Python3 初识Python
  19. BFS搜索
  20. Spring:基于注解的依赖注入的使用

热门文章

  1. 持久层之 MyBatis: 第三篇 :缓存 And 高级查询
  2. Could not open ServletContext resource [/WEB-INF/applicationContext.xml] 解决办法
  3. 如何理解java枚举,看例子
  4. jQuery报错:Uncaught ReferenceError: $ is not defined解决方法
  5. CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)
  6. 大数据量查询容易OOM?试试MySQL流式查询
  7. CentOs 7 安装mysql5.7.18(二进制版本)
  8. jdbc-创建statement-数量过多导致游标超限
  9. SpringBoot整合sa-token,完成网站权限验证
  10. ElasticSearch教程——分片、扩容以及容错机制(转学习使用)