java - 为什么 Reflection API 会为现有的枚举构造函数抛出 NoSuchMethodException?

标签 java enums

更新:我的问题与Instantiate enum class无关.该问题只需要使用现有值之一实例化枚举。我在问:为什么 Reflection API 抛出 NoSuchMethodException对于真正存在的方法

以下代码运行是否正确,取决于是否 Xpto声明为 classenum .

class Xpto {
  // Bar; // include this for enum declaration
  private Xpto() {      
  }
}

public class App {
  public static void main(String[] args) throws Exception{
    Constructor<Xpto> constructor = Xpto.class.getDeclaredConstructor();
    constructor.setAccessible(true);
    constructor.newInstance();
  }
}

在这两种情况下 javap显示构造函数 private Xpto() .如果Xpto是一个类,然后是 javap -private 的结果是:

class Xpto {
  private Xpto();
}

如果Xpto是一个枚举,然后是 javap -private 的结果是:

final class Xpto extends java.lang.Enum<Xpto> {
  ...
  private Xpto();
  static {};
}

然而对于后者它抛出一个异常:

Exception in thread "main" java.lang.NoSuchMethodException: Xpto.<init>()
    at java.lang.Class.getConstructor0(Unknown Source)

在这两种情况下,编译的结果都是一个带有私有(private)构造函数Xpto.class.getDeclaredConstructor();中反射API的使用不报告关于 Xpto 的错误作为一个枚举,不是。它只是抛出没有这样的方法Xpto.<init>()对于枚举的情况。 这不是真的。因为那个构造函数存在。

最佳答案

这里来自 Java documentation :

The final clone method in Enum ensures that enum constants can never be cloned, and the special treatment by the serialization mechanism ensures that duplicate instances are never created as a result of deserialization. Reflective instantiation of enum types is prohibited. Together, these four things ensure that no instances of an enum type exist beyond those defined by the enum constants.

关于java - 为什么 Reflection API 会为现有的枚举构造函数抛出 NoSuchMethodException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52989787/

相关文章:

java - 如何获取对非默认 MIDI 音序器的引用?

c# - 为什么 enum.ToString() 给出的结果与调试器工具提示中显示的结果不同?

Python Enum 在对成员值使用相同的字典时显示奇怪的行为

java - 收集器分组由 java 8

Java - 运行 jarfile 使程序没有响应

Java程序无一异常(exception)卡在executeUpdate上

java - 为什么我不能从 Java 中的专用枚举值访问静态最终成员

java - 反弦、余弦和正切代码

python - 在 Python 中从 Enum 创建字典时,'float' 对象不可调用

java - 希望使用2个枚举来描述java中的类并将它们分配给主函数中的类