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

Java ASM树API:如何预打印AbstractInstructionNode?,java,jvm,bytecode,java-bytecode-asm,Java,Jvm,Bytecode,Java Bytecode Asm,有什么简单的方法可以做到这一点吗?我看到了许多使用MethodVisitors的方法,以及不打印整个类文件的方法,但我所需要做的只是打印一条指令,希望是以一种好的方式 我已经找到了用于打印操作码名称的操作码表,但是是否也提供了预打印内容的方法?没有用于预打印方法字节码的ASM函数。您必须反复阅读指令并打印您想要的指令。没有ASM函数来预打印方法字节码。您必须反复阅读这些说明并打印您想要的说明。假设您有一些随机的AbstractInSnode: AbstractInsnNode insnNode

有什么简单的方法可以做到这一点吗?我看到了许多使用MethodVisitors的方法,以及不打印整个类文件的方法,但我所需要做的只是打印一条指令,希望是以一种好的方式


我已经找到了用于打印操作码名称的操作码表,但是是否也提供了预打印内容的方法?

没有用于预打印方法字节码的ASM函数。您必须反复阅读指令并打印您想要的指令。

没有ASM函数来预打印方法字节码。您必须反复阅读这些说明并打印您想要的说明。

假设您有一些随机的AbstractInSnode:

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);
在此示例中,InSnodeAsString将为:

"    IFLT L0\n"
i、 e.它在末端包括一个线路馈线

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

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();
  }
}

假设您有一些随机的AbstractInSnode:

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);
在此示例中,InSnodeAsString将为:

"    IFLT L0\n"
i、 e.它在末端包括一个线路馈线

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

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();
  }
}