【问题标题】:Formatting the output of a TraceClassVisitor格式化 TraceClassVisitor 的输出
【发布时间】:2011-11-02 09:18:57
【问题描述】:

假设我想用 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 来过滤我不想要的东西,但它实际上是一个 final 类(真糟糕!)。

有没有办法格式化TraceClassVisitor 的输出?如果不是,您认为过滤掉我不关心的内容的最佳方法是什么?

【问题讨论】:

    标签: java bytecode java-bytecode-asm


    【解决方案1】:

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

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

    【讨论】:

    • ClassReader.SKIP_DEBUG 似乎工作正常!我想知道为什么 EmptyVisitor 似乎在 ASM 4.0 中消失了?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我的标准做法:获取源代码,搜索'n'替换final class -> class,重新编译。

      【讨论】:

      • 在没有final的情况下编译它,从中创建一个新的JAR。或者重命名该类并将其添加到您的项目中。
      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2021-04-11
      • 2017-02-10
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多