我正在开发一种基于JVM的编程语言,我使用Buddy作为代码生成器。该语言有点类似于Java,但通常使用注释,其中Java将使用关键字。一些示例注释是public、private、extends、override、singleton或inject。
与Java语言规范不同,Java虚拟机规范对类名的限制非常少,从JVM的角度来看,像extends或public这样的名称是完全有效的。但是,当我试图生成一个名为Java关键字的注释类时,我会从Buddy的IllegalStateException类得到一个Illegal type name。
我如何绕过Java语言特有的验证,转而使用遵循Java虚拟机规范的更为宽松的验证规则?
发布于 2019-10-13 20:27:13
您可以简单地禁用验证:
new ByteBuddy().with(TypeValidation.DISABLED);发布于 2019-10-12 07:31:37
在研究了一段时间后,我可能找到了一个解决方案,但这是非常麻烦的,希望有人知道更好的方法.
幸运的是,对于我来说,KEYWORDS字段在net.bytebuddy.dynamic.scaffold.InstrumentedType.Default中只使用一个普通的可变HashSet而不是Collections.unmodifiableSet,因此通过下面的黑客,我能够删除对Java关键字的验证:
val Field KEYWORDS = Default.getDeclaredField("KEYWORDS")
KEYWORDS.setAccessible(true)
val Set<String> keywords = KEYWORDS.get(null) as Set<String>
keywords.clear(代码是用夏普语法编写的,但您了解到了)
尽管如此,我还是第一个承认使用Java反射在其他库的final static字段中穿插不是最佳实践的人。所以,虽然我的直接阻滞剂被移除,但我希望这个问题有一个更正统的解决方案.
https://stackoverflow.com/questions/58351680
复制相似问题