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

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

如何通過ASM中的核心api獲取maxLocals?

如何通過ASM中的核心api獲取maxLocals?

FFIVE 2022-12-21 13:06:43
我想獲取maxLocals存儲數據,比如int index = mv.visitLocalVariable(name, desc, null, start, end, ++maxLocals);通過tree api,this.nextLocals = methodNode.maxLocals; 但核心 api,什么都沒有。inject into out , error method around biz~.像這樣:@Test    public void testCode() {        hooK hook = StatisGet.get(1L);        hook.into();        try {            //biz            hook.out();        } catch (Throwable e) {            hook.error(e);        }    }現在我能夠成功地注入字節碼,但是 solt 有時會出錯,因為我無法獲取 maxLocal。
查看完整描述

1 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

假設“核心 API”指的是訪問者 API,上面有方法visitMaxs,MethodVisitor將使用最大堆棧和局部變量編號調用。

但是有一個問題; 此方法將在其他訪問者方法之后調用。所以你不能事先使用那個數字來找到一個未使用的局部變量。

一種解決方案是使用適配器,LocalVariablesSorter如果您認為它是“核心 API”的一部分。它允許你在你需要一個空閑的局部變量時調用newLocal,它會告訴你下一個到目前為止還沒有遇到的變量號。然后它會記住這個編號,如果在繼續訪問原始代碼時遇到變量號使用沖突,它會重新編號這些變量號,以解決沖突。

在處理注入的代碼時,您只需要關心在原始方法訪問者(編寫者)上調用訪問者方法,因為LocalVariablesSorter將為原始代碼調用訪問者方法并進行轉換。另請參閱此答案那個答案。


查看完整回答
反對 回復 2022-12-21
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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