为了账号安全,请及时绑定邮箱和手机立即绑定

禁用 Byte Buddy 中的标识符验证

禁用 Byte Buddy 中的标识符验证

炎炎设计 2023-10-19 18:21:49
我正在研究基于 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 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您可以简单地禁用验证:

new ByteBuddy().with(TypeValidation.DISABLED);


查看完整回答
反对 回复 2023-10-19
?
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其他库的领域并不完全是最佳实践的人。因此,虽然我的直接阻止程序已被删除,但我希望有一个更正统的解决方案来解决这个问题......


查看完整回答
反对 回复 2023-10-19
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信