2 votes

Java ASM Tree API : Comment imprimer AbstractInstructionNode ?

Existe-t-il un moyen simple de le faire ? Je vois un tas de façons d'utiliser MethodVisitors et autres pour imprimer des fichiers de classe entiers, mais tout ce que j'ai besoin de faire, c'est d'imprimer une seule instruction, j'espère d'une manière agréable.

J'ai déjà trouvé la table OPCODES pour imprimer le nom de l'opcode, mais existe-t-il un moyen d'imprimer aussi le contenu ?

4voto

Jonas Berlin Points 719

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

0voto

zaz Points 425

Il n'existe pas de fonction ASM permettant d'imprimer le bytecode d'une méthode. Vous devrez itérer à travers les instructions et imprimer celles que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X