Форматирование вывода TraceClassVisitor

Допустим, я хочу красиво напечатать байт-код метода с библиотекой asm.

public int get777() { return 777; }

через TraceClassVisitor будет выглядеть как

  // access flags 0x1
  public get777()I
   L0
    LINENUMBER 21 L0
    SIPUSH 777
    IRETURN
   L1
    LOCALVARIABLE this Lsomething/Point; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
}

Теперь дело в том, что я забочусь только о

    SIPUSH 777
    IRETURN

поскольку все остальное в значительной степени не имеет значения для меня, поэтому я хочу стереть их.

Я думал отфильтровать то, что мне не нужно, унаследовав TraceMethodVisitor, но на самом деле это оказался конечный класс (облом!).

Есть ли вообще способ форматирования вывода TraceClassVisitor? Если нет, то какой, по вашему мнению, лучший способ отфильтровать то, что меня не волнует?


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


Ответы (3)


Вы можете избавиться от номеров строк и информации о локальных переменных, передав флаг ClassReader.SKIP_DEBUG в метод ClassReader.accept().

Альтернативным подходом может быть добавление посетителя перед TraceClassVisitor и TraceMethodVisitor, который будет проглатывать события, которые вы не хотите видеть в выводе.

person Eugene Kuleshov    schedule 02.11.2011
comment
ClassReader.SKIP_DEBUG работает нормально! Мне было интересно, почему EmptyVisitor, кажется, исчез в ASM 4.0? - person devoured elysium; 02.11.2011

Я бы рассмотрел возможность предоставления собственного принтера (возможно, расширение или делегирование Textifier) через TraceClassVisitor(ClassVisitor,Printer,PrintWriter). Я не тестировал этот подход.

person McDowell    schedule 02.11.2011

Мой стандартный подход: получить исходный код, найти и заменить final class -> class, перекомпилировать.

person Aaron Digulla    schedule 02.11.2011
comment
Скомпилируйте его без финала, создайте из него новый JAR. Или переименуйте класс и добавьте его в свой проект. - person Aaron Digulla; 02.11.2011