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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程澄 中级黑马   /  2014-2-22 17:26  /  1007 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程澄 于 2014-2-22 17:28 编辑

为什么动态代理对象只能是目标类的上级接口类型。
  1. List li = (List) Proxy.newProxyInstance(
  2.         ArrayList.class.getClassLoader(),
  3.         ArrayList.class.getInterfaces(),
  4.         new InvocationHandler() {
  5.         public Object invoke(Object proxy, Method method,
  6.                    Object[] args) throws Throwable
  7.                    {
  8.                           System.out.println("proxy");

  9.                           Object retVal = method.invoke(new ArrayList(), args);

  10.                           return retVal;
  11.                    }
  12.          });
复制代码
List li = (List) Proxy.newProxyInstance
只能是List,Collection
我代理的是ArrayList,为什么ArrayList li = (ArrayList) Proxy.newProxyInstance会发生$Proxy0 cannot be cast to java.util.ArrayList


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
ArrayList.class.getInterfaces()跟这个有木有和关系。。。调用的方法是父类或接口及自己的。。。猜测。。。

下面是关于getInterfaces()函数的API 文档->
public Class<?>[] getInterfaces()确定此对象所表示的类或接口实现的接口。
如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。数组中接口对象顺序与此对象所表示的类的声明的 implements 子句中接口名顺序一致。例如,给定声明:

class Shimmer implements FloorWax, DessertTopping { ... }
设 s 的值为 Shimmer 的一个实例;表达式:
s.getClass().getInterfaces()[0]
的值为表示 FloorWax 接口的 Class 对象;
s.getClass().getInterfaces()[1]
的值为表示 DessertTopping 接口的 Class 对象。
如果此对象表示一个接口,则该数组包含表示该接口扩展的所有接口的对象。数组中接口对象顺序与此对象所表示的接口的声明的 extends 子句中接口名顺序一致。

如果此对象表示一个不实现任何接口的类或接口,则此方法返回一个长度为 0 的数组。

如果此对象表示一个基本类型或 void,则此方法返回一个长度为 0 的数组。


返回:
该类所实现的接口的一个数组。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
李金中 发表于 2014-2-22 19:16
ArrayList.class.getInterfaces()跟这个有木有和关系。。。调用的方法是父类或接口及自己的。。。猜测。。 ...

你觉得有关系?
还是没明白。。。。。
回复 使用道具 举报
程澄 发表于 2014-2-22 19:59
你觉得有关系?
还是没明白。。。。。

额  我也不懂。。。我理解错了
回复 使用道具 举报
简单理解,目标类和代理类,代理类实际上可以理解为:为具有实现了相同接口的目标类增加系统功能。动态代理也一样。至于为什么要实现相同接口?可以理解为多态,面向接口(父类)编程,这样的好处在一般简单的代码这感觉麻烦,但是如果我们不能建立子类对象就只能通过它的父级来创建。在你这只是指定某一个类创建一个该对象,你只能获取这个类加载器和接口,如果采用上一级的获取到的是上一级的类加载器,这样子类也可以加载,另外还可以获取接口列表,不然那么多接口列表你只能自己一个个添加。简单理解,希望对你有帮助。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马