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

标签 java instrumentation java-bytecode-asm

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

最佳答案

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

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

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

  • 对于构造函数和实例方法,0是接收者本身(this),参数从1+开始索引
  • 对于静态方法,参数从0+开始索引
  • longdouble 消耗两个局部变量槽,所以下一个参数/局部变量的索引是2 + 上一个索引<

应用于示例,这会产生

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

关于java - 使用 ASM 字节码检测在堆栈上加载构造函数参数(值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166602/

相关文章:

java - 如何在spring boot secuirty中为具有不同请求方法类型的同一url赋予不同的角色权限

java - H2 删除并创建别名 to_char 不起作用

Java - 将复杂的 List#toString 转换为列表

java - 如果存在注释,则将接口(interface)添加到转换后的类

java - 如何解析可能有或没有命名空间的 XML 内容?

java - 各个 Java 字节码的执行时间有多大差异?

java - ASM : getting local variable name and value inside a method of a class

java - 使用ASM创建方法

java - 如何在 Java 中加载修改后的父类(super class)?