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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任亚俊 中级黑马   /  2013-12-25 21:31  /  3049 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //获取ArrayList类的代理类的Class对象
  2.                 Class clazz=Proxy.getProxyClass(ArrayList.class.getClassLoader(), Collection.class);
  3.                 //从Class对象中获取其构造方法
  4.                 Constructor [] constructor=clazz.getConstructors();
  5.                 //变量构造方法数组,打印
  6.                 /*
  7.                  * Constructor(参数类型,参数类型)
  8.                  */
  9.                 String name;
  10.                 Class parameters[];
  11.                 for(Constructor con:constructor){
  12.                         name=con.getName();
  13.                         parameters=con.getParameterTypes();
  14.                         //构造字符串
  15.                         StringBuilder sb=new StringBuilder(name);
  16.                         sb.append("(");
  17.                         for(Class para:parameters){
  18.                                 sb.append(para.getName());
  19.                                 sb.append(",");
  20.                         }
  21.                         sb.deleteCharAt(sb.length()-1);
  22.                         sb.append(")");
  23.                         System.out.println(sb);
  24.                 }
复制代码
如上代码,当我把第一句代码改成Class clazz=Proxy.getProxyClass(ArrayList.class.getClassLoader(), List.class);时程序报非法参数错误,1.为什么会报错呢,List是ArrayList的接口啊?

2.第二个参数是个可变参数,如果一个类实现了多个接口,必须把接口都写上,还是只写一个也行?
谢谢各位大神解答。

评分

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

查看全部评分

3 个回复

倒序浏览
首先,你遇到不明白的可以查API : getProxyClass(ClassLoader loader, Class<?>... interfaces)对可以传递给 Proxy.getProxyClass 的参数有以下几个限制:
  • interfaces 数组中的所有 Class 对象必须表示接口,而不能表示类或基本类型。
  • interfaces 数组中的两个元素不能引用同一 Class 对象。
  • 所有接口类型的名称通过特定的类加载器必须可见。换句话说,对于类加载器 cl 和所有接口 i,以下表达式必须为 true:      Class.forName(i.getName(), false, cl) == i
  • 所有非公共接口必须位于同一包中;否则,该代理类将不可能实现所有的接口,无论它在哪一个包中定义。
  • 对于有相同签名的指定接口中任何成员方法集:
  • 如果任何方法的返回类型是基本类型或 void,那么所有的方法必须具有与此相同的返回类型。
  • 否则,该方法之一必须是返回类型,它可以指派给该方法其余的所有返回类型。
  • 得到的代理类必须不超过虚拟机在类上施加的任何限制。例如,虚拟机可以限制某一类实现至多 65535 的接口数;在这种情况下,interfaces 数组的大小必须不超过 65535。
如果违反了这些限制,Proxy.getProxyClass 将抛出 IllegalArgumentException。如果 interfaces 数组参数或其任何元素为 null,则将抛出 NullPointerException。

关于换成List,不可以?你确认你没把List的包倒错?我这边调试运行是可以的。




1.png (39.47 KB, 下载次数: 45)

1.png

评分

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

查看全部评分

回复 使用道具 举报
给你贴些文档里的描述,看的不是很明白

对可以传递给 Proxy.getProxyClass 的参数有以下几个限制:

interfaces 数组中的所有 Class 对象必须表示接口,而不能表示类或基本类型。
interfaces 数组中的两个元素不能引用同一 Class 对象。
所有接口类型的名称通过特定的类加载器必须可见。换句话说,对于类加载器 cl 和所有接口 i,以下表达式必须为 true:
     Class.forName(i.getName(), false, cl) == i
所有非公共接口必须位于同一包中;否则,该代理类将不可能实现所有的接口,无论它在哪一个包中定义。
对于有相同签名的指定接口中任何成员方法集:
如果任何方法的返回类型是基本类型或 void,那么所有的方法必须具有与此相同的返回类型。
否则,该方法之一必须是返回类型,它可以指派给该方法其余的所有返回类型。
得到的代理类必须不超过虚拟机在类上施加的任何限制。例如,虚拟机可以限制某一类实现至多 65535 的接口数;在这种情况下,interfaces 数组的大小必须不超过 65535。

评分

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

查看全部评分

回复 使用道具 举报
(0.0)’ 发表于 2013-12-25 22:27
首先,你遇到不明白的可以查API : getProxyClass(ClassLoader loader, Class... interfaces)对可以传递给  ...

谢谢,却是是调错包了,太粗心了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马