Проблемы с пониманием переименования метода с помощью байт-кода ASM в Java

В настоящее время я пытаюсь понять, как работает библиотека 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.


person devoured elysium    schedule 27.10.2011    source источник


Ответы (2)


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

person Eugene Kuleshov    schedule 27.10.2011
comment
Но я не понимаю. Разве мой читатель класса не должен только читать? Я думал, что только вещи, отправленные писателю класса, напишут вещь. Или читатель класса отправляет это возвращаемое значение писателю класса на моей спине? - person devoured elysium; 27.10.2011
comment
Я не понимаю вашего вопроса. Однако обратите внимание, что ClassWriter является реализацией ClassVisitor, который обычно помещается в конец цепочки посетителей. ClassReader считывает байт-код и создает очередь событий, переданных экземпляру ClassVisitor, переданному методу classReader.accept(..). Вы можете посмотреть один из старых руководств по ASM. API немного изменился, но концепции остались прежними asm.ow2.org/doc/tutorial.html - person Eugene Kuleshov; 02.11.2011

Я тоже впервые столкнулся с этим вопросом.

Возможно, это неясно при чтении учебника по ASM, так как вас смущает множество концепций.

У меня есть несколько советов для вас, чтобы учиться.

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

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

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

PS:

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

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

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

person biaobiaoqi    schedule 22.11.2011