我正在研究基于 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條經驗 獲得超6個贊
在研究了 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
提交
取消