在 Byte Buddy 中禁用标识符验证

Disable validation of identifiers in Byte Buddy

我正在研究一种基于 JVM 的编程语言,我使用 Byte Buddy 作为代码生成器。该语言有点类似于 Java,但通常使用注释,而 Java 将使用关键字。一些示例注释是 publicprivateextendsoverridesingletoninject

与Java语言规范不同,Java虚拟机规范对class 名称,以及像 extendspublic 这样的名称从 JVM 的角度来看是完全有效的。 但是,当我尝试使用恰好是 Java 关键字的名称生成注释 classes 时,我从 Byte Buddy 的 InstrumentedType class.

如何规避特定于 Java 语言的验证并改用遵循 Java 虚拟机规范的更宽松的验证规则?

在稍微研究了 Byte Buddy 资源之后,我可能找到了解决方案,但它非常老套,希望有人知道更好的方法...

对我来说幸运的是,net.bytebuddy.dynamic.scaffold.InstrumentedType.Default 中的 KEYWORDS 字段只使用一个普通的可变 HashSet 而不是 Collections.unmodifiableSet,所以通过以下 hack 我能够删除 Java 个关键字的验证:

val Field KEYWORDS = Default.getDeclaredField("KEYWORDS")
KEYWORDS.setAccessible(true)
val Set<String> keywords = KEYWORDS.get(null) as Set<String>
keywords.clear

(代码是用 Xtend 语法编写的,但你明白了)

话虽这么说,但我是第一个承认使用 Java 反射在其他库的 final static 字段中查找并不是最佳实践的人。所以,虽然我的直接阻止程序被删除了,但我希望有一个更正统的解决方案来解决这个问题...

您可以简单地禁用验证:

new ByteBuddy().with(TypeValidation.DISABLED);