亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

禁用 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條經驗 獲得超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其他庫的領域并不完全是最佳實踐的人。因此,雖然我的直接阻止程序已被刪除,但我希望有一個更正統的解決方案來解決這個問題......


查看完整回答
反對 回復 2023-10-19
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號