使用 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 .
我有一个方法 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 .