禁用 Byte Buddy 中的标识符验证

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

与 Java语言规范不同,Java虚拟机规范对类名施加的限制非常少,从 JVM 角度来看,类似extends或 之类的名称是完全有效的。public然而,当我尝试生成名称恰好是 Java 关键字的注释类时,我从 Byte Buddy 的类中得到一个IllegalStateException“ ”。Illegal type nameInstrumentedType

如何绕过 Java 语言特有的验证并使用遵循 Java 虚拟机规范的更宽松的验证规则?


炎炎设计
浏览 101回答 2
2回答

慕尼黑的夜晚无繁华

您可以简单地禁用验证:new ByteBuddy().with(TypeValidation.DISABLED);

ibeautiful

在研究了 Byte Buddy 源代码之后,我可能找到了一个解决方案,但它非常 hacky,希望有人知道更好的方法......对我来说幸运的是,KEYWORDS中 的字段net.bytebuddy.dynamic.scaffold.InstrumentedType.Default仅使用普通的可变字段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 Reflection 探索final static其他库的领域并不完全是最佳实践的人。因此,虽然我的直接阻止程序已被删除,但我希望有一个更正统的解决方案来解决这个问题......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java