使用ASM获取通过ARETURN字节码指令返回的引用

时间:2015-04-01 17:14:47

标签: bytecode java-bytecode-asm bytecode-manipulation

我有一个方法,它返回一个在另一个类似于此的方法中生成的值:

public static FileChannel open()
{
    return provider.newObject();
}

因此该方法的字节码大致如下所示:

INVOKEVIRTUAL org/test/Helper.process ()Lorg/test/MyObject;
ARETURN

我有一个Java代理,它在JVM启动时使用ASM进行字节码转换。

现在我想注入访问返回的MyObject的代码,而不需要对调用本身做太多更改,即理想情况下我只需要在ARETURN之前添加一些字节码指令。

哪个ASM /字节码构造允许我访问此处返回的对象?

2 个答案:

答案 0 :(得分:3)

对于简单的事情,您可以在其中放入DUP指令,然后进行所需的使用。如果你需要注入更复杂的代码,你应该将它存储在一个寄存器中(因为除了在areturn引发异常的极不可能的事件之外它不会在你的代码之后使用它并不重要。在方法中有一个异常处理程序。)

因此,如果您使用寄存器0,它就会像 astore_0 (您的代码)aload_0 areturn

答案 1 :(得分:1)

如果您只想访问返回语句,IMO更容易使用AdviceAdapter

它有onMethodExit(int opcode)方法,可以通过以下方式覆盖:

public void onMethodExit(int opcode) {
    if( opcode != ARETURN ) {
           return;
    } 
//put yout code here
}

我还建议阅读http://download.forge.objectweb.org/asm/asm4-guide.pdf