格式化TraceClassVisitor的输出

时间:2011-11-02 09:18:57

标签: java bytecode java-bytecode-asm

假设我想用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的输出?如果没有,你认为最好的方法是过滤掉我不关心的东西?

3 个答案:

答案 0 :(得分:1)

您可以通过将ClassReader.SKIP_DEBUG标志传递给ClassReader.accept()方法来删除行号和局部变量信息。

另一种方法是在TraceClassVisitor和TraceMethodVisitor之前添加一个访问者,它会吞下你不希望在输出中看到的事件。

答案 1 :(得分:1)

我会考虑通过Printer构造函数提供我自己的Textifier(可能会扩展或委托给TraceClassVisitor(ClassVisitor,Printer,PrintWriter))。我没有测试过这种方法。

答案 2 :(得分:0)

我的标准方法:获取源代码,search'nplace final class - > class,重新编译。