如何通过ASM中的核心api获取maxLocals?

我想获取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。


FFIVE
浏览 61回答 1
1回答

ibeautiful

假设“核心 API”指的是访问者 API,上面有方法visitMaxs,MethodVisitor将使用最大堆栈和局部变量编号调用。但是有一个问题; 此方法将在其他访问者方法之后调用。所以你不能事先使用那个数字来找到一个未使用的局部变量。一种解决方案是使用适配器,LocalVariablesSorter如果您认为它是“核心 API”的一部分。它允许你在你需要一个空闲的局部变量时调用newLocal,它会告诉你下一个到目前为止还没有遇到的变量号。然后它会记住这个编号,如果在继续访问原始代码时遇到变量号使用冲突,它会重新编号这些变量号,以解决冲突。在处理注入的代码时,您只需要关心在原始方法访问者(编写者)上调用访问者方法,因为LocalVariablesSorter将为原始代码调用访问者方法并进行转换。另请参阅此答案和那个答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java