2013-08-03 59 views
0

有沒有簡單的方法來做到這一點?我看到了很多使用MethodVisitors的方法,以及不能打印出整個類文件的方法,但我只需要打印一條指令,希望能以一種很好的方式。Java ASM Tree API:如何打印AbstractInstructionNode?

我已經找到OPCODES表來打印出操作碼的名字,但是有沒有提供的方式來打印內容呢?

回答

0

Theres沒有ASM函數來打印方法字節碼。您將必須遍歷指令並打印您想要的指令。

2

比方說,你有一些隨機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(); 
    } 
}