Java ASM MethodVisitor не вызывает методы ClassVisitor - PullRequest
0 голосов
/ 13 января 2019

планируется инструктировать методы в Java-классе с помощью Java asm,

{

    ClassReader cr = new ClassReader(classfileBuffer);
    ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = new LogMethodClassVisitor(cw, className);
    cr.accept(cv,  0);
    newClassByte = cw.toByteArray();

}

Ниже приведен производный класс от ClassVisitor

public class LogMethodClassVisitor extends ClassVisitor {
    private String className;

    public LogMethodClassVisitor(ClassVisitor cv, String pClassName) {
        super(Opcodes.ASM4, cv);
        className = pClassName;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc,
                                     String signature, String[] exceptions) {
        MethodVisitor mv = super.visitMethod(access, name, desc, signature,
                exceptions);

        if (name.equalsIgnoreCase("getParameter") && (mv != null)) {
            mv =  new PrintMessageMethodVisitor(mv, name, className);

        }

        return mv;
    }
}


public class PrintMessageMethodVisitor extends MethodVisitor {

    String name;
    String classname;

    public PrintMessageMethodVisitor (MethodVisitor mv, String name, String classname)

    {
        super(ASM5, mv);
        this.name = name;
        this.classname = classname;
    }


    @Override
    public void visitCode() {
        {
            System.out.println ("###### entering visitCode ###### ");
        }
    }

вызывается только конструктор в PrintMessageMethodVisitor из MethodVisitor. Никакой другой метод, такой как visitCode, не вызывается.

Я пробовал разные подходы с этого форума, такие как,

1) use adviceadapter instead of methodVistor
2) cr.accept(cv,ClassReader.EXPAND_FRAMES) ;

Никто из них не работал.

и у меня включены эти свойства,

                    <Can-Redefine-Classes>true</Can-Redefine-Classes>
                    <Can-Retransform-Classes>true</Can-Retransform-Classes>
                    <Can-Set-Native-Method-Prefix>true</Can-Set-Native-Method-Prefix>

Приведенный выше код является типичным примером инструментария Java asm, я, должно быть, пропустил тривиальный кусок, но не могу понять это.

Есть подсказка? пожалуйста помоги. Спасибо

1 Ответ

0 голосов
/ 13 января 2019

Очень глупая ошибка. метод является абстрактной функцией без кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...