学习记录:用反射去获取枚举类的问题
首先,创建一个枚举类
public enum EnumSingle { INSTANCE; public EnumSingle getInstance(){ return INSTANCE; } }
试图使用反射去获取枚举类对象
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { EnumSingle instance1 = EnumSingle.INSTANCE; Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class); declaredConstructor.setAccessible(true); EnumSingle enumSingle1 = declaredConstructor.newInstance(); EnumSingle enumSingle2 = declaredConstructor.newInstance(); //NoSuchMethodException: com.kuang.single.EnumSingle.<init>() 没有空参构造器 System.out.println(enumSingle1 == enumSingle2); }
报错一个异常 Exception in thread “main” java.lang.NoSuchMethodException: com.kuang.single.EnumSingle.() 在idea中是可以看到这个枚举类是有一个无参构造器的 通过命令行去反编译这个Enum.class
javap -p EnumSingle.class
依旧是看到了一个无参的构造器 这时候就很奇怪了,明明有一个无参的构造器,但是为什么会报异常呢?
这时,使用jad.exe这个反编译软件去看这个Enum.class 下载地址
https://varaneckas.com/jad/
输入命令
jad -sjava EnumSingle.class
此时,终于看到了这个枚举类中真正的构造器,是一个有参构造器
public final class EnumSingle extends Enum { public static EnumSingle[] values() { return (EnumSingle[])$VALUES.clone(); } public static EnumSingle valueOf(String name) { return (EnumSingle)Enum.valueOf(com/kuang/single/EnumSingle, name); } private EnumSingle(String s, int i) { super(s, i); } public EnumSingle getInstance() { return INSTANCE; } public static final EnumSingle INSTANCE; private static final EnumSingle $VALUES[]; static { INSTANCE = new EnumSingle("INSTANCE", 0); $VALUES = (new EnumSingle[] { INSTANCE }); } }