我正在研究基于 JVM 的编程语言,并使用 Byte Buddy 作为代码生成器。该语言有点类似于 Java,但通常使用注释,而 Java 使用关键字。一些示例注释是public、private、extends、override或singleton。inject与 Java语言规范不同,Java虚拟机规范对类名施加的限制非常少,从 JVM 角度来看,类似extends或 之类的名称是完全有效的。public然而,当我尝试生成名称恰好是 Java 关键字的注释类时,我从 Byte Buddy 的类中得到一个IllegalStateException“ ”。Illegal type nameInstrumentedType如何绕过 Java 语言特有的验证并使用遵循 Java 虚拟机规范的更宽松的验证规则?
2 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
在研究了 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其他库的领域并不完全是最佳实践的人。因此,虽然我的直接阻止程序已被删除,但我希望有一个更正统的解决方案来解决这个问题......
添加回答
举报
0/150
提交
取消