黑马程序员技术交流社区

标题: 悬赏50币求解~ [打印本页]

作者: 笑脸迷人    时间: 2014-10-25 23:47
标题: 悬赏50币求解~
如何在枚举类外部创建该枚举类的对象?
我试过,使用反射获取枚举类的构造方法,然后暴力反射,之后创建枚举类的时候抛异常了:java.lang.IllegalArgumentException: Cannot reflectively create enum objects(不能反射的方式创建enum的对象~)
枚举类代码:
  1. public enum AAA {
  2.        
  3.         AA;
  4.        
  5. }
复制代码



主方法代码如下:


  1.         public static void main(String[] args) throws Exception {
  2.                 //获取枚举类AAA的字节码文件
  3.                 Class clazz = Class.forName("bug.test.java.AAA");
  4.                 //查询api发现有enum的构造方法
  5.                 Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class);
  6.                 constructor.setAccessible(true);//暴力反射
  7.                 System.out.println(constructor.getName());//
  8.                 AAA aaa = (AAA) constructor.newInstance("AV", Integer.MAX_VALUE);//抛异常了
  9.                 System.out.println(aaa.AA);


复制代码

各位大牛,能解决这个异常么?或是其他方式创建枚举类的对象?



作者: cs8630323    时间: 2014-10-26 01:26
本帖最后由 cs8630323 于 2014-10-26 01:29 编辑

IllegalArgumentException - 如果实参和形参的数量不同;如果基本参数的解包转换失败;如果在可能的解包后,无法通过方法调用转换将参数值转换为相应的形参类型;如果此构造方法属于枚举类型。

看api,规定不能使用枚举类构造器
作者: zhangyangLengen    时间: 2014-10-26 10:26
因为,枚举类型其实就是一个单例模式,单例模式的构造方法是private 不能对外创建对象。
作者: zhangyangLengen    时间: 2014-10-26 10:27
所以使用反射也不能
作者: hanxing    时间: 2014-10-26 12:05
据我所知你的AA就是一个对象,只不过这个对象还没有值
如果想通过反射获取AAA对象AA;你可以在AAA中提供一个static AAA getInstanceAA(){return AA}方法
再在主函数中利用反射得到这个方法,最后invoke这个方法就行了.
个人意见仅供参考!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2