gpt4 book ai didi

java - 在字节码层面,Java的Class.getEnumConstants()如何知道哪些类是枚举类?

转载 作者:行者123 更新时间:2023-11-30 06:40:19 26 4
gpt4 key购买 nike

Java 反射 API 包含一个方法 Class.getEnumConstants()这使得可以确定一个类是否是 enum类(如果它认为该类不是 null ,则返回 enum ),以及它的常量是什么。

我正在开发一个直接生成 JVM 字节码的程序,并尝试生成一个枚举类。因此,我需要知道 Java 如何从字节码中识别枚举类,以便 getEnumConstants将正常工作。显然,该类需要扩展Enum ,但这显然还不够(例如,与 public class Example extends Enum<Example> {} 相对应的字节码将不会被识别为 enum );类的 JVM 字节码还需要具备哪些其他功能,Java 的反射 API 才能将其识别为 Java enum ,并能够确定其枚举常量?

最佳答案

为了编译enum类型,您必须用 ACC_ENUM 标记该类类的访问标志中的标志。

此外,对于每个常量,您必须创建相应的 public static final字段也标记有 ACC_ENUM 在字段的访问标志中。

那么,你需要一个 class initializer (一个名为 void 的无参数 <clinit> 方法)创建实例并将它们分配给字段。

但这还不够。心灵the language specification ,它指定了两个隐式声明的方法的存在

  /**
* Returns an array containing the constants of this enum
* type, in the order they're declared. This method may be
* used to iterate over the constants as follows:
*
* for(E c : E.values())
* System.out.println(c);
*
* @return an array containing the constants of this enum
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type. (Extraneous whitespace
* characters are not permitted.)
*
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);

这是编译器的职责。字节码生成工具将其实现插入到特定的枚举类型。请注意,尽管是编译器生成的,这两个方法 should not get marked as synthetic .


该规范没有说明反射将如何收集其信息。它可以迭代标记的字段并读取它们,以组装一个数组,或者它可以只调用 values()具体类型的方法。因此,您不能省略任何这些工件,也不能实现 values()方法只需委托(delegate)给 Class.getEnumConstants() .

关于java - 在字节码层面,Java的Class.getEnumConstants()如何知道哪些类是枚举类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592675/

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