1

如何使用 ASM 字节码查看或访问方法参数值或对象?

4

2 回答 2

1

方法参数是前几个局部变量。要访问第一个参数,字节码助记符看起来像aload_0oriload_0lload_0等,具体取决于参数的类型。对于第四个之后的论点,你会说aload 4等等。

请注意,实例方法的第一个参数是对this. 所以第一个参数将是本地#1,你会得到它,aload_1等等。

但是,您会使用 ASM 的东西生成字节码……这样做。看起来你会说类似的东西mv.visitVarInsn(ALOAD, 0);mv你的 MethodVisitor 在哪里。将0替换为局部变量索引。

于 2013-02-15T04:52:53.453 回答
1

考虑到方法参数类型,您可以执行以下操作:

int off = (access | Opcodes.ACC_STATIC) == 0 ? 0 : 1;
int opcode = Type.getArgumentTypes(desc)[param + off].getOpcode(Opcodes.IALOAD);
mv.visitVarIns(opcode, param);
...

其中param是方法参数编号,access并且是您从ClassVisitor.html#visitMethoddesc的相应参数中获得的值。

于 2013-02-26T03:39:28.703 回答