如何在 ASM 中通过 core api 获取 maxLocals?

how to get maxLocals by core api in ASM?

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

假设“Core API”是指访问者 API,MethodVisitor 上有方法 visitMaxs,它将以最大堆栈调用和局部变量号。

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

一个解决方案是使用适配器,LocalVariablesSorter, if you consider it to be part of the “Core API”. It allows you to invoke newLocal当你需要一个空闲的局部变量时它会告诉你下一个到目前为止还没有遇到的变量号。然后它会记住编号,如果在继续访问原始代码时遇到变量编号使用冲突,它将重新编号这些变量编号,以解决冲突。

在处理注入的代码时,您只需要关心在原始方法访问者(编写者)上调用访问者方法,就像 LocalVariablesSorter will be invoked for the original code and transformed. See also and .

上的访问者方法一样