Java bytecode asm ASM字节码方法参数值

Java bytecode asm ASM字节码方法参数值,java-bytecode-asm,Java Bytecode Asm,如何使用ASM字节码查看或访问方法参数值或对象?方法参数是前几个局部变量。要访问第一个参数,字节码助记符看起来像aload_0或iload_0或lload_0等,具体取决于参数的类型。对于超过第四个的参数,您会说aload 4等等 注意,实例方法的第一个参数是对this的引用。所以第一个参数是局部的#1,你会得到它,比如aload_1等等 然而,你会用ASM的东西生成字节码。。。那样做。看起来你会说一些类似于mv.visitVarInsn(ALOAD,0)的话,其中mv是您的方法访问者。0将替换

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

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

注意,实例方法的第一个参数是对this的引用。所以第一个参数是局部的#1,你会得到它,比如
aload_1
等等


然而,你会用ASM的东西生成字节码。。。那样做。看起来你会说一些类似于mv.visitVarInsn(ALOAD,0)的话,其中
mv
是您的方法访问者。
0
将替换为局部变量索引。

考虑到方法参数类型,您可以这样做:

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
是您从的相应参数中获得的值。

Hi,感谢您的回复。。你能举一些使用ASM的例子吗;我从来没有使用过这些东西,我甚至很难理解为什么它会起作用,更不用说它是如何起作用的了,部分原因是游客滥用的猖獗。看起来一切都是某种访客P一个真正的字节码生成库会更简单;请参阅.net的
System.Reflection.Emit
access | Opcodes.ACC_STATIC
是否应改为
access&Opcodes.ACC_STATIC