使用 Byte Buddy 添加枚举值
Add enum value with Byte Buddy
假设我有一个如下所示的枚举
public enum BindingType {
BINDING_OPEN("M1+O", "Open", true),
BINDING_SAVE("M1+S", "Save", true),
...
private BindingType(
final String sequence,
final String keyLabel,
final boolean reserved) {
this.sequence = sequence;
this.keyLabel = keyLabel;
this.reserved = reserved;
}
}
在 JVM 启动时我想添加一个额外的值,例如
BINDING_CUSTOM("M1+U", "Custom", true)
可以使用 Byte Buddy 的 AgentBuilder
来完成吗?
枚举不过是枚举类型的public static final
字段。您当然可以为枚举类型声明这样一个字段,并通过 builder.executable(isTypeInitializer())
检测静态初始化程序,以通过调用 class 的构造函数将字段设置为一个值。
此外,您可能需要将 class 的 values
方法检测到 return 具有其他值的附加常量和 valueOf
方法来解析附加常数。
枚举只是这种方法和字段组合的合成糖。 Byte Buddy 为创建新枚举提供了便利,但如果更改现有枚举,您需要执行一些手动步骤。
假设我有一个如下所示的枚举
public enum BindingType {
BINDING_OPEN("M1+O", "Open", true),
BINDING_SAVE("M1+S", "Save", true),
...
private BindingType(
final String sequence,
final String keyLabel,
final boolean reserved) {
this.sequence = sequence;
this.keyLabel = keyLabel;
this.reserved = reserved;
}
}
在 JVM 启动时我想添加一个额外的值,例如
BINDING_CUSTOM("M1+U", "Custom", true)
可以使用 Byte Buddy 的 AgentBuilder
来完成吗?
枚举不过是枚举类型的public static final
字段。您当然可以为枚举类型声明这样一个字段,并通过 builder.executable(isTypeInitializer())
检测静态初始化程序,以通过调用 class 的构造函数将字段设置为一个值。
此外,您可能需要将 class 的 values
方法检测到 return 具有其他值的附加常量和 valueOf
方法来解析附加常数。
枚举只是这种方法和字段组合的合成糖。 Byte Buddy 为创建新枚举提供了便利,但如果更改现有枚举,您需要执行一些手动步骤。