如何使用ASM字节代码查看或访问方法参数值或对象?
答案 0 :(得分:1)
方法参数是前几个局部变量。要访问第一个arg,字节码助记符看起来像aload_0
或iload_0
或lload_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
是方法参数编号,access
和desc
是从ClassVisitor.html#visitMethod的相应参数中获得的值。