当前位置: 首页 > 知识库问答 >
问题:

在字节码级别上,Java的Class.getENumContems()如何知道哪些类是枚举类?

金瑞
2023-03-14

Java反射API包含一个方法类。getEnumConstants()。

我正在开发一个直接生成JVM字节码的程序,并试图生成一个枚举类。因此,我需要知道Java如何从字节码识别枚举类,以便getEnumConstants能够正确工作。显然,类需要扩展Enum,但这显然是不够的(例如,公共类示例对应的字节码扩展了Enum)


共有1个答案

傅阿苏
2023-03-14

为了编译枚举类型,必须在类的访问标志中使用ACC_ENUM标志来标记类。

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

然后,需要一个名为

但这还不够。请注意语言规范,它指定了两个隐式声明的方法的存在

  /**
  * 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);

这是编译人员的职责。字节码生成工具,用于将其实现插入特定的枚举类型。请注意,尽管这两个方法是由编译器生成的,但它们不应被标记为合成的。

该规范没有说明反射将如何收集其信息。它可以遍历标记的字段并读取它们,以组装数组,或者只调用特定类型的value()方法。因此,您不能省略任何这些工件,也不能通过将委托委托给Class.getENumConstan()来实现value()方法。

 类似资料:
  • 我的问题是:我如何只通过分析字节码就知道被抛出的异常的类型? 值得一提的是,当我们调用源代码中的throw语句时,并不总是会实例化一个新的异常类型。因此,查看新指令的参数类型并不是一个解决方案。

  • 例如,我如何做类似的事情: 结果示例:

  • 问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S

  • 我在laravel 5中工作,我有一个模块,用户可以在其中更新学生的信息,因为用户有一个带有当前数据的预加载表单,并且可以修改他想要的字段。然后,在控制器中,我执行以下操作: 那工作得很好。所以我的问题是:有一种方法可以获得已经更新的字段的名称?

  • 问题内容: 首先,这不是中Enums的重复:) 这个问题的公认答案表明,这是表示Ruby中枚举的好方法: 在Java中,可以将多个值和方法附加到枚举值。我想在Ruby中实现相同或相似的东西。 代表此Java枚举的最类似于Ruby的方式是什么: 编辑: 我还想保留Java枚举的隐式功能: …检索序数值 …对枚举值(或等效值)的调用方法 例子: 问题答案: class MyEnum attr_acce