首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用Buddy中标识符的验证

禁用Buddy中标识符的验证
EN

Stack Overflow用户
提问于 2019-10-12 06:57:29
回答 2查看 232关注 0票数 4

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

与Java语言规范不同,Java虚拟机规范对类名的限制非常少,从JVM的角度来看,像extendspublic这样的名称是完全有效的。但是,当我试图生成一个名为Java关键字的注释类时,我会从Buddy的IllegalStateException类得到一个Illegal type name

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-13 20:27:13

您可以简单地禁用验证:

代码语言:javascript
复制
new ByteBuddy().with(TypeValidation.DISABLED);
票数 2
EN

Stack Overflow用户

发布于 2019-10-12 07:31:37

在研究了一段时间后,我可能找到了一个解决方案,但这是非常麻烦的,希望有人知道更好的方法.

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

代码语言:javascript
复制
val Field KEYWORDS = Default.getDeclaredField("KEYWORDS")
KEYWORDS.setAccessible(true)
val Set<String> keywords = KEYWORDS.get(null) as Set<String>
keywords.clear

(代码是用夏普语法编写的,但您了解到了)

尽管如此,我还是第一个承认使用Java反射在其他库的final static字段中穿插不是最佳实践的人。所以,虽然我的直接阻滞剂被移除,但我希望这个问题有一个更正统的解决方案.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58351680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档