Java (ASM): почему при выполнении динамически инструментированного кода почему инструментальный код не может найти мой класс? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь использовать классы другой 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.

Кто-нибудь знает, почему возникает это несоответствие?

...