Устранение неполадок при переименовании метода с помощью ASM Bytecode в Java - PullRequest
1 голос
/ 27 октября 2011

В настоящее время я пытаюсь понять, как работает библиотека ASM. Я решил попробовать переименовать все методы данного класса, поэтому я написал мини MethodRenamer посетитель:

class MethodRenamer extends ClassAdapter {
    public MethodRenamer(ClassVisitor cv) {
        super(cv);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        MethodVisitor methodVisitor = cv.visitMethod(access, name+"_new", desc, signature, exceptions);         
        return methodVisitor;
    }
}

Это на самом деле делает меня полной работой, но я не могу понять, почему. Я думал, что с данным кодом будет только для каждого метода m создать метод m_new, пустой кода. Но вопреки моим ожиданиям, он как-то заполняет каждый m_new оригинальным кодом.

Как это может произойти? У меня была идея, что в выходной файл будет записано только то, что я пересылаю на cv. Я нигде не говорю cv, что это за код исходного кода m, так что, я думаю, здесь что-то еще происходит? Похоже, что единственно возможным вариантом является то, что он каким-то образом использует мой возвращенный methodVisitor.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

MethodVisitor, возвращаемый из MethodRenamer.visitMethod (), - это метод, используемый ClassReader для заполнения тела метода.Если вам нужен пустой метод, вы должны вернуть null.См. соответствующий JavaDoc .

1 голос
/ 22 ноября 2011

Я тоже встречался с этим вопросом в первый раз.

Может быть, неясно, когда вы читаете учебник для ASM, так как многие концепции сбили вас с толку.

У меня есть несколько советов для вас, чтобы выучить.* Во-первых, концепция обратного вызова в программировании. .

Пример: система предлагает вам книгу, вам предлагается прочитать ее заново.Ваша работа - написать метод для чтения этой книги.У каждого свой метод чтения, может быть, вы хотите прочитать его быстро, игнорируя главы, которые вас не интересуют, может быть, вы хотите читать внимательно и медленно. В любом случае, ваша задача - создать метод, который реализует то, как вы читаете эту книгу,Затем вы даете этот метод чтения в систему.система получит ваш метод и сделает то, что вы назначили в своем методе.Это процесс обратного вызова. И я думаю, что это поможет вам больше всего.

  • Затем выясните, каков шаблон посетителя .Шаблоны проектирования в любом месте программы.Я думаю, именно так работает платформа ASM.

  • Наконец, перейдите к учебникам по ASM.

PS:

ответна Shouldn't my class reader only read?

Хотя и называется «ClassReader», его работа не ограничивается чтением байт-кода.Он будет вызывать другие методы через другие классы, как MethodVisitor, который отвечает за байт-код инструмента в методах.А у MethodVisitor есть просто обратный вызов.

Среда ASM, которая может помочь вам изменить байт-код, держитесь подальше от подробностей байт-кода.

...