学习记录:用反射去获取枚举类的问题

首先,创建一个枚举类

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
        });
    }
}
经验分享 程序员 微信小程序 职场和发展