在 Byte Buddy 中禁用标识符验证
Disable validation of identifiers in Byte Buddy
我正在研究一种基于 JVM 的编程语言,我使用 Byte Buddy 作为代码生成器。该语言有点类似于 Java,但通常使用注释,而 Java 将使用关键字。一些示例注释是 public
、private
、extends
、override
、singleton
或 inject
。
与Java语言规范不同,Java虚拟机规范对class 名称,以及像 extends
或 public
这样的名称从 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);
我正在研究一种基于 JVM 的编程语言,我使用 Byte Buddy 作为代码生成器。该语言有点类似于 Java,但通常使用注释,而 Java 将使用关键字。一些示例注释是 public
、private
、extends
、override
、singleton
或 inject
。
与Java语言规范不同,Java虚拟机规范对class 名称,以及像 extends
或 public
这样的名称从 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);