Java(ASM):动态运行检测代码时,为什么找不到检测到的代码?

时间:2018-09-17 22:26:13

标签: java instrumentation java-bytecode-asm

我正在尝试检测另一个Java程序的类,特别是插入方法调用以跟踪堆栈变量的访问。但是,在加载检测到的代码时,它抱怨无法找到我的类。但是,如果我尝试在检测方法中使用Class.forName,它将找到我的类。

以下是相关代码:

@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
    super.visitFieldInsn(opcode, owner, name, desc);
    // Instrument if it's getting/setting a static variable, adding code after the access
    if (opcode == Opcodes.GETSTATIC) {
        try {
            Class.forName(STATIC_TRACER_CLASS_NAME.replace("/", "."));

            System.out.println("Found class: " + STATIC_TRACER_CLASS_NAME);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        super.visitLdcInsn(owner.replace('/', '.') + "." + name);   // Change to make the field name have .
        super.visitMethodInsn(Opcodes.INVOKESTATIC,
                STATIC_TRACER_CLASS_NAME,
                "logStatic",
                "(Ljava/lang/String;)V",
                false);
    }
}

它确实打印出“ Found class”,所以我有一定的信心,这不是类路径问题。

有人知道为什么会出现这种差异吗?

0 个答案:

没有答案