首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASM中通过核心api获取maxLocals?

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

Stack Overflow用户
提问于 2019-05-28 20:17:44
回答 1查看 79关注 0票数 0

我想获取用于存储数据的maxLocals,比如

代码语言:javascript
复制
int index = mv.visitLocalVariable(name, desc, null, start, end, ++maxLocals);

tree apithis.nextLocals = methodNode.maxLocals;,但核心应用程序接口,什么都没有。

注入out,biz~周围的错误方法。

如下所示:

代码语言:javascript
复制
@Test
    public void testCode() {
        hooK hook = StatisGet.get(1L);
        hook.into();
        try {
            //biz
            hook.out();
        } catch (Throwable e) {
            hook.error(e);
        }
    }

现在我可以成功地注入字节码,但solt有时会出错,因为我无法获得maxLocal。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 21:14:48

假设“Core API”指的是Visitor API,那么在MethodVisitor上有一个方法visitMaxs,它将使用最大堆栈和局部变量数来调用。

但是有一个catch;这个方法将在其他访问者方法之后调用。所以你不能预先使用这个数字来找到一个未使用的局部变量。

一个解决方案是使用适配器,LocalVariablesSorter,如果您认为它是“Core API”的一部分。它允许你在需要一个空闲的局部变量时调用newLocal,它会告诉你到目前为止还没有遇到的下一个变量数。然后它会记住这个数字,如果在继续访问原始代码时遇到冲突的变量编号,它会重新编号这些变量编号,以解决冲突。

在处理注入的代码时,您只需注意调用原始方法访问器(编写器)上的访问器方法,因为将为原始代码调用LocalVariablesSorter上的访问器方法并进行转换。另请参见this answerthat answer

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56342106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档