【发布时间】:2009-09-10 01:12:57
【问题描述】:
我正在使用 ASM 来为 Java 程序进行字节码检测。我所做的很简单 - 在检测方法时,如果指令是 PUTFIELD,只需在指令之前执行 DUP_X1,然后访问 PUTFIELD 并使用包含 DUP 的堆栈条目的参数注入函数调用。
public void visitFieldInsn(
int opcode,
String owner, // owner of this field...
String name,
String desc) {
boolean did_dup = false;
if(opcode == Opcodes.PUTFIELD) {
if(!owner.equals("java/lang/System")) {
if (desc.startsWith("L")) {
mv.visitInsn(Opcodes.DUP_X1);
did_dup = true;
}
}
}
mv.visitFieldInsn(opcode, owner, name, desc);
if (did_dup) {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
}
}
代码在检测之前和之后分别如下所示:
public void setA(ClassA classa)
{
refA = classa;
eyeColor = classa.eyeColor;
}
public void setA(ClassA classa)
{
ASide.updateG(refA = classa, this);
ASide.updateG(eyeColor = classa.eyeColor, this);
}
但是当我运行检测代码时,我得到:
java.lang.VerifyError: Expecting to find object/array on stack
你能提供这方面的帮助吗?
【问题讨论】:
-
你确定是在抱怨修改后的 setA 方法吗?
-
这不是在抱怨 setA 方法 Martin - 这是一个敏锐的观察。你认为我应该调查它抱怨的实际方法吗?它似乎与内部类有关。
-
这与内部类有关 - 但我不确定为什么这很重要。
标签: java assembly bytecode instrumentation java-bytecode-asm