gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:14:58 25 4
gpt4 key购买 nike

更新:我的问题与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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com