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

Using ASM to get the reference returned via ARETURN bytecode instruction

我有一个方法 returns 在另一个类似于此的方法中生成的值:

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

所以方法的字节码大致是这样的:

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

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

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

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

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

所以如果你使用寄存器 0,它会像 astore_0 (您的代码)aload_0 areturn.

如果你只想访问 return 声明 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 .