Java ASM Tree API:如何预打印AbstractInstructionNode?

时间:2013-08-03 00:38:58

标签: java jvm bytecode java-bytecode-asm

有没有简单的方法可以做到这一点?我看到了一些使用MethodVisitors的方法以及不打印整个类文件的方法,但我需要做的就是打印出一条指令,希望以一种很好的方式。

我已经找到了OPCODES表来打印出操作码名称,但是有没有提供的方法来打印内容呢?

2 个答案:

答案 0 :(得分:3)

假设你有一些随机的AbstractInsnNode:

AbstractInsnNode insnNode = new JumpInsnNode(Opcodes.IFLT, new LabelNode(new Label()));

那么你可以像这样漂亮地打印出来:

/* Create a "printer" that renders text versions of instructions */
Printer printer = new Textifier();
TraceMethodVisitor methodPrinter = new TraceMethodVisitor(printer);

/* render the instruction as a string and add it to printer's internal buffer */
insnNode.accept(methodPrinter);

/* convert printer's internal buffer to string and clear the buffer (so we can reuse it later) */
StringWriter sw = new StringWriter();
printer.print(new PrintWriter(sw));
printer.getText().clear();
String insnNodeAsString = sw.toString();

/* print the string out */
System.out.print(insnNodeAsString);

在这个例子中,insnNodeAsString将是:

"    IFLT L0\n"

即。它包括最后的换行符。

我们可以将所有这些包装到一个很好的实用程序类中:

public class InsnPrinter {
  private static final Printer printer = new Textifier();
  private static final TraceMethodVisitor methodPrinter = new TraceMethodVisitor(printer);

  public static String prettyprint(AbsractInsnNode insnNode) {
    insnNode.accept(methodPrinter);
    StringWriter sw = new StringWriter();
    printer.print(new PrintWriter(sw));
    printer.getText().clear();
    return sw.toString();
  }
}

答案 1 :(得分:0)

Theres没有ASM功能来重新打印方法字节码。您将不得不遍历说明并打印出您想要的指令。