ASM字节码方法参数值

时间:2013-02-15 04:25:28

标签: java-bytecode-asm

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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是方法参数编号,accessdesc是从ClassVisitor.html#visitMethod的相应参数中获得的值。