学习记录:用反射去获取枚举类的问题
首先,创建一个枚举类
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
});
}
}
