A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡智 中级黑马   /  2013-9-16 15:11  /  1013 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡智 于 2013-9-16 22:41 编辑

先上代码:
  1. ArrayList proxy = (ArrayList)Proxy.newProxyInstance(
  2.                                 ArrayList.class.getClassLoader(),
  3.                                 ArrayList.class.getInterfaces(),
  4.                                 new InvocationHandler() {
  5.                                         ArrayList target = new ArrayList();
  6.                                         public Object invoke(Object proxy, Method method, Object[] args)
  7.                                                         throws Throwable {
  8.                                                 Long startTime = System.currentTimeMillis();
  9.                                                 Object obj = method.invoke(target, args);
  10.                                                 Long costTime = System.currentTimeMillis()-startTime;
  11.                                                 System.out.println(method.getName()+"方法运行了"+costTime/1000+"秒");
  12.                                                 return obj;
  13.                                         }
  14.                                 });
复制代码
问题1:为什么生成的动态代理proxy不能转换成ArrayList类型的,但是List类型的可以。
问题2:InvocationHandler中的invoke方法用到3个参数,第一个是Object proxy,可是这个参数在方法中就没用到。那要传它干嘛?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

2 个回复

倒序浏览
gulup 来自手机 中级黑马 2013-9-16 16:14:49
沙发
第一个问题,因为生成的代理类并不是ArrayList类型的,只是实现了ArrayList相同的接口。而该接口就是List,根据多态的特性,所以可以转型为List。
第二个,这个参数的确是没用到的。但只是你这个代理并没有用到,关于这个参数,可以百度下这个报数,有很多很详细的解释,手机发帖,就不写了。
回复 使用道具 举报
gulup 发表于 2013-9-16 16:14
第一个问题,因为生成的代理类并不是ArrayList类型的,只是实现了ArrayList相同的接口。而该接口就是List,根 ...

好的,谢了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马