Я пытаюсь использовать классы другой 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);
}
}
Распечатывается «Найденный класс», так что я в меру уверен, что это не проблема classpath.
Кто-нибудь знает, почему возникает это несоответствие?