如何通过ASM复制JVM堆栈中方法的参数?

How to duplicate the parameters of a method in JVM stack by ASM?

我正在使用 ASM 在一个特殊方法之后插入一个方法。比如一个方法如下:

a.doSomeThing(p1, p2, p3, p4, p5, p6)

我想在后面插入一个方法,就像这样:

a.doSomeThing(p1, p2, p3, p4, p5, p6)
MyClass.myMethod(a, p1, p2, p3, p4, p5, p6) //insert a static method

insert方法参数与上一个相同

我知道在调用虚拟 doSomeThing 时,值位于堆栈的顶部。我怎样才能复制它们,并将它们用于 myMethod?

如果只有一个参数,或者只有两个非long或double的参数,可以分别使用DUPDUP2指令。如果有两个以上的参数,就没有办法直接使用字节码复制它们。相反,您需要将它们保存到局部变量,然后再读回。

终于解决了。 调用a.doSomeThing(p1, p2, p3, p4, p5, p6)时,栈中的操作数栈帧顺序为a p1 p2 p3 p4 p5 p6,所以只需要将它们存储到局部变量中为p6 p5 p4 p3 p2 p1 a,现在我将它们从局部变量加载到堆栈,然后调用 a.doSomeThing(p1, p2, p3, p4, p5, p6),接下来,再次加载局部变量并调用 MyClass.myMethod(a, p1, p2, p3, p4, p5, p6).
通过这种方式,我插入了与之前方法具有相同参数的代码。