我想获取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条经验 获得超5个赞
假设“核心 API”指的是访问者 API,上面有方法visitMaxs
,MethodVisitor
将使用最大堆栈和局部变量编号调用。
但是有一个问题; 此方法将在其他访问者方法之后调用。所以你不能事先使用那个数字来找到一个未使用的局部变量。
一种解决方案是使用适配器,LocalVariablesSorter
如果您认为它是“核心 API”的一部分。它允许你在你需要一个空闲的局部变量时调用newLocal
,它会告诉你下一个到目前为止还没有遇到的变量号。然后它会记住这个编号,如果在继续访问原始代码时遇到变量号使用冲突,它会重新编号这些变量号,以解决冲突。
在处理注入的代码时,您只需要关心在原始方法访问者(编写者)上调用访问者方法,因为LocalVariablesSorter
将为原始代码调用访问者方法并进行转换。另请参阅此答案和那个答案。
添加回答
举报
0/150
提交
取消