我想獲取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將為原始代碼調用訪問者方法并進行轉換。另請參閱此答案和那個答案。
添加回答
舉報
0/150
提交
取消
