Java反射API包含一个方法类。getEnumConstants()。
我正在开发一个直接生成JVM字节码的程序,并试图生成一个枚举类。因此,我需要知道Java如何从字节码识别枚举类,以便
getEnumConstants
能够正确工作。显然,类需要扩展Enum
,但这显然是不够的(例如,公共类示例对应的字节码扩展了Enum)
为了编译枚举
类型,必须在类的访问标志中使用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