Supposons que vous ayez un AbstractInsnNode aléatoire :
AbstractInsnNode insnNode = new JumpInsnNode(Opcodes.IFLT, new LabelNode(new Label()));
vous pouvez alors l'imprimer de la manière suivante :
/* 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);
Dans cet exemple, insnNodeAsString sera :
" IFLT L0\n"
c'est-à-dire qu'il inclut un saut de ligne à la fin.
Nous pourrions intégrer tout cela dans une classe utilitaire :
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();
}
}