如何在Java中使用反射创建枚举实例?
当我阅读 Effective 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语言规范(§8.9):
尝试显式实例化枚举类型(第15.9.1节)是一个编译时错误。Enum中的最终克隆方法可确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复的实例。禁止枚举类型的反射实例化。总之,这四件事确保了枚举类型的实例不存在超出枚举常量定义的实例的情况。
这样做的全部目的是允许安全地使用==
比较Enum
实例。
。
以上是 如何在Java中使用反射创建枚举实例? 的全部内容, 来源链接: utcz.com/qa/410710.html