当我阅读有效的Java时,作者告诉我,单元素enum类型是实现单例的最佳方法,因为我们不必考虑复杂的序列化或反射攻击。这意味着我们不能使用反射创建enum的实例,对吗?

我已经使用enum类进行了一些测试:

public enum Weekday {}

然后,我尝试创建Weekday的实例:
Class<Weekday> weekdayClass = Weekday.class;
Constructor<Weekday> cw = weekdayClass.getConstructor(null);
cw.setAccessible(true);
cw.newInstance(null);

如您所知,它不起作用。当我将关键字enum更改为class时,它可以工作。我想知道为什么。谢谢。

最佳答案

这是语言内置的。从Java Language Specification (§8.9):



这样做的全部目的是允许安全地使用==来比较Enum实例。

编辑:请参阅the answer by @GotoFinal,以了解如何使用反射方式打破此“保证”。

关于java - 如何在Java中使用反射创建枚举实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9614282/

10-13 04:39