当前位置: 首页 > 面试题库 >

如何在Java中使用反射创建枚举实例?

郁光熙
2023-03-14
问题内容

当我阅读 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);

如您所知,它不起作用。当我更改关键字enumclass,它的工作原理。我想知道为什么。谢谢。


问题答案:

这是语言内置的。根据Java语言规范(§8.9):

尝试显式实例化枚举类型(第15.9.1节)是一个编译时错误。Enum中的最终克隆方法可确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复的实例。禁止枚举类型的反射实例化。总之,这四件事确保了枚举类型的实例不存在超出枚举常量定义的实例的情况。

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



 类似资料:
  • 问题内容: 假设您有一个文本文件,例如: 您希望相应地更新相应的对象: 凡是不同种类的枚举。 我想有一个通用的方法来实例化枚举值。也就是说,在运行时使用反射,而无需事先知道对象的枚举类型。 我会想到这样的事情: 问题是:应该有什么呢?给定其String表示形式,甚至可以实例化未知枚举吗? 问题答案: 之后不应该被调用-它返回实例的类 你可以投,避免一般性的问题,因为你已经知道的是

  • 问题内容: 我使用的枚举中的常量是一个类。我需要在常量上调用一个方法,但无法引入编译时依赖性,并且枚举在运行时并非始终可用(可选安装的一部分)。因此,我想使用反射。 这很容易,但是我以前没有对枚举使用反射。 枚举看起来像这样: 用反射调用常量方法的例子是什么? 问题答案:

  • 问题内容: 我要做什么才能完成此任务?另外,可以说我将其更改为: 我该如何使它符合Decodable? EDit 这是我的完整代码(不起作用) 最终编辑 另外,它将如何处理这样的枚举? 问题答案: 这很简单,只需使用或隐式分配的原始值即可。 被编码到并到 要么 被编码到并到 这是一个简单的示例如何使用它:

  • 此处使用的运算符不能用于所使用的值类型。您要么在这里使用了错误的类型,要么使用了错误的运算符

  • 问题内容: 我正在制作绘图应用程序,我想通过枚举引用我的颜色。例如,每次我想要红色时,使用它会更干净,更方便,而不用键入值。但是,Swift的原始值枚举似乎并不接受UIColor作为类型。有没有办法用枚举或类似方法做到这一点? 问题答案: 我这样做(基本上使用结构作为名称空间): 您可以像这样使用它: 因此,您可以在自定义主题中使用红色。

  • 问题内容: 可以使用反射在抽象祖先类中创建派生类的实例吗? } 问题答案: 你可以这样做 版画 一种更常见的模式是使用Cloneable 版画 但是,应避免使用两者之一。通常,还有另一种方法可以满足您的需求,因此基础不会隐式地依赖于派生。