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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 笑脸迷人 中级黑马   /  2014-10-25 23:47  /  1330 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何在枚举类外部创建该枚举类的对象?
我试过,使用反射获取枚举类的构造方法,然后暴力反射,之后创建枚举类的时候抛异常了: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);


复制代码

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


评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 cs8630323 于 2014-10-26 01:29 编辑

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

看api,规定不能使用枚举类构造器

评分

参与人数 1黑马币 +8 收起 理由
笑脸迷人 + 8

查看全部评分

回复 使用道具 举报
因为,枚举类型其实就是一个单例模式,单例模式的构造方法是private 不能对外创建对象。
回复 使用道具 举报
所以使用反射也不能
回复 使用道具 举报
据我所知你的AA就是一个对象,只不过这个对象还没有值
如果想通过反射获取AAA对象AA;你可以在AAA中提供一个static AAA getInstanceAA(){return AA}方法
再在主函数中利用反射得到这个方法,最后invoke这个方法就行了.
个人意见仅供参考!

评分

参与人数 1黑马币 +2 收起 理由
笑脸迷人 + 2

查看全部评分

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