我想获取用于存储数据的maxLocals
,比如
int index = mv.visitLocalVariable(name, desc, null, start, end, ++maxLocals);
由tree api
,this.nextLocals = methodNode.maxLocals;
,但核心应用程序接口,什么都没有。
注入out,biz~周围的错误方法。
如下所示:
@Test
public void testCode() {
hooK hook = StatisGet.get(1L);
hook.into();
try {
//biz
hook.out();
} catch (Throwable e) {
hook.error(e);
}
}
现在我可以成功地注入字节码,但solt有时会出错,因为我无法获得maxLocal。
发布于 2019-05-28 21:14:48
假设“Core API”指的是Visitor API,那么在MethodVisitor
上有一个方法visitMaxs
,它将使用最大堆栈和局部变量数来调用。
但是有一个catch;这个方法将在其他访问者方法之后调用。所以你不能预先使用这个数字来找到一个未使用的局部变量。
一个解决方案是使用适配器,LocalVariablesSorter
,如果您认为它是“Core API”的一部分。它允许你在需要一个空闲的局部变量时调用newLocal
,它会告诉你到目前为止还没有遇到的下一个变量数。然后它会记住这个数字,如果在继续访问原始代码时遇到冲突的变量编号,它会重新编号这些变量编号,以解决冲突。
在处理注入的代码时,您只需注意调用原始方法访问器(编写器)上的访问器方法,因为将为原始代码调用LocalVariablesSorter
上的访问器方法并进行转换。另请参见this answer和that answer。
https://stackoverflow.com/questions/56342106
复制相似问题