有沒有簡單的方法來做到這一點?我看到了很多使用MethodVisitors的方法,以及不能打印出整個類文件的方法,但我只需要打印一條指令,希望能以一種很好的方式。Java ASM Tree API:如何打印AbstractInstructionNode?
我已經找到OPCODES表來打印出操作碼的名字,但是有沒有提供的方式來打印內容呢?
有沒有簡單的方法來做到這一點?我看到了很多使用MethodVisitors的方法,以及不能打印出整個類文件的方法,但我只需要打印一條指令,希望能以一種很好的方式。Java ASM Tree API:如何打印AbstractInstructionNode?
我已經找到OPCODES表來打印出操作碼的名字,但是有沒有提供的方式來打印內容呢?
Theres沒有ASM函數來打印方法字節碼。您將必須遍歷指令並打印您想要的指令。
比方說,你有一些隨機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();
}
}