使用ASM字节码检测在堆栈上加载构造函数参数(值)

时间:2015-07-01 16:13:45

标签: java instrumentation java-bytecode-asm

我一直在尝试使用ASM java库进行检测,但是我无法找到一种方法将构造函数参数值加载到堆栈上,同时检测构造函数并使用探测器检索它们。我可以将方法描述((Ljava / lang / String; Ljava / lang / String;)V)添加到堆栈中但是我需要这些参数的值

1 个答案:

答案 0 :(得分:3)

您可以使用*LOAD指令加载参数,使用visitVarInsn MethodVisitor方法插入这些指令。例如,请考虑以下构造函数:

public Foo(int i, long l, int j) {}

您收到的值取决于visitVarInsn(int opcode, int index)方法的第二个参数:

  • 对于构造函数和实例方法,0是接收者本身(this),参数从1 +
  • 索引
  • 对于静态方法,参数从0 +
  • 建立索引
  • longdouble使用两个局部变量槽,因此下一个参数/局部变量的索引为2 + previous index

应用于示例,这会产生

  • ALOAD 0加载this(或super
  • ILOAD 1加载i参数
  • LLOAD 2加载l参数
  • ILOAD 4 加载j参数