我一直在尝试使用 ASM java 库进行检测,但是我找不到一种方法可以在检测构造函数时将构造函数参数值加载到堆栈上并使用探测器检索它们。我可以将方法描述 ((Ljava/lang/String;Ljava/lang/String;)V) 添加到堆栈,但是我需要这些参数的值
最佳答案
您可以使用 *LOAD
指令加载参数,您可以使用 MethodVisitor
的 visitVarInsn
方法插入这些指令。例如,考虑这个构造函数:
public Foo(int i, long l, int j) {}
您收到的值取决于 visitVarInsn(int opcode, int index)
方法的第二个参数:
- 对于构造函数和实例方法,
0
是接收者本身(this
),参数从1+开始索引 - 对于静态方法,参数从0+开始索引
long
和double
消耗两个局部变量槽,所以下一个参数/局部变量的索引是2 + 上一个索引
<
应用于示例,这会产生
ALOAD 0
加载this
(或super
)ILOAD 1
加载i
参数LLOAD 2
加载l
参数ILOAD
4
加载j
参数
关于java - 使用 ASM 字节码检测在堆栈上加载构造函数参数(值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166602/