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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

                Constructor enumCon = Enum.class.getDeclaredConstructor(null);
                //报NoSuchMethodException

评分

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

查看全部评分

2 个回复

倒序浏览
你在创建枚举时,编译器为你生成了一个类,该类继承自java.lang.Enum。
所以,Enum.class的值是class java.lang.Enum,即系统的枚举类,这个类首先是没有空参数的构造器的,
以下取自JDK 1.6的源码:
这个是枚举类的构造器,
protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
上面的注释“ Sole constructor.  Programmers cannot invoke this constructor.”
这句话的意思是,唯一的构造器,程序员不能获取这个构造器。
invoke这个词,你应该很熟悉了,是反射里很重要的方法。
枚举的“构造器”是为了给有参数的枚举值赋值用的,它和一般类的构造器是有区别的,枚举类是无法创建对象的,也是不能从枚举继承子类的,所以,枚举类所谓的“构造器”其实不是一般意义的构造器。

评分

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

查看全部评分

回复 使用道具 举报
hauntedlove 发表于 2014-3-4 13:37
你在创建枚举时,编译器为你生成了一个类,该类继承自java.lang.Enum。
所以,Enum.class的值是class java. ...

我得出最终答案来了,反射MyEnum.class.getDeclaredConstructor(String.class,int.class);会报
Cannot reflectively create enum objects
枚举只实例化一次,第二次创建实例起,就会抵御反射攻击
以下是单例模式抵御暴力反射的方法:
  1. class Single{
  2.        
  3.         private static int count = 0;
  4.        
  5.         private Single(){
  6.                 if(count == 1){
  7.                         throw new RuntimeException("只能初始化一次!");
  8.                 }
  9.                 count++;
  10.         }
  11.        
  12.         private static Single instance = new Single();
  13.        
  14.         public static Single getInstance(){
  15.                 return instance;
  16.         }
  17.        
  18. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马