我正在尝试检测另一个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”,所以我有一定的信心,这不是类路径问题。
有人知道为什么会出现这种差异吗?