Я пытаюсь реализовать преобразование в ASM, которое требует двух проходов по каждому методу. Первый должен собрать информацию о том, где необходима аппаратура (имеет отношение к цели перехода, поэтому мне нужны два прохода), а вторая заполняет собранную информацию и добавляет прибор. Это также означает, что я должен выполнить первый проход (т. Е. Обработать все инструкции), прежде чем начать второй проход. Вот почему нормальная схема цепочки, описанная в руководстве, не работает.Как связать ASM MethodVisitors от конца до конца
Мой вопрос: есть ли элегантный и удобный способ сделать это?
Единственное решение, с которым я мог придумать, - это позвонить второму посетителю с посещенияEnd() у первого посетителя. Схема выглядит следующим образом
public class Pass1Visitor extends MethodVisitor {
...
public void visitEnd() {
//do stuff the call the second visitor
thisMethodNode.accept(new Pass2Visitor());
}
}
Мне не нравится это решение слишком много, потому что я подозреваю, что в будущем мне придется цепными больше посетителей, и я, возможно, захотите, чтобы иметь возможность выбрать и выбрать. Что с этим действительно невозможно.
Это довольно много, что я имел. Я надеялся, что будет более простой способ. (Это требует прохождения вокруг посетителей и MethodNode в дополнение ко всему тому, что мне нужно в любом случае). – Jochen
Я обновил свой ответ несколькими подробностями и примерами. Обход посетителей - основная идея дизайна ASM API. –
Хорошо, тогда, наверное, мне придется это сделать ... :) – Jochen