asm工具類TraceClassVisitor使用

ASM是java字節碼操縱和分析的框架。

下面介紹一下asm  org.objectweb.asm.util包中工具類TraceClassVisitor的使用。

TraceClassVisitor能夠將java字節碼以文本的方式展現出來。示例如下:

import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.util.TraceClassVisitor;

/**
 * TraceClassVisitor usage
 * 
 */
public class TestClassWriter {

    public static void main(String[] args) throws UnsupportedEncodingException {
        ClassWriter cw = new ClassWriter(0);
        TraceClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out));
        cv.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
                 "test/asm/examples/Comparable", null, "java/lang/Object",
                 new String[] { "test/asm/examples/Mesurable" });
        cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "LESS", "I", null, new Integer(-1)).visitEnd();
        cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "EQUAL", "I", null, new Integer(0)).visitEnd();
        cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "GREATER", "I", null, new Integer(1)).visitEnd();
        cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo", "(Ljava/lang/Object;)I", null, null).visitEnd();
        cv.visitEnd();

        // byte[] b = cw.toByteArray();
        // System.out.println(new String(b));
        // System.out.println(Type.getType(String.class).getDescriptor());

    }
}

運行後得到的java字節碼爲

// class version 49.0 (49)
// access flags 0x601
public abstract interface test/asm/examples/Comparable implements test/asm/examples/Mesurable  {


  // access flags 0x19
  public final static I LESS = -1

  // access flags 0x19
  public final static I EQUAL = 0

  // access flags 0x19
  public final static I GREATER = 1

  // access flags 0x401
  public abstract compareTo(Ljava/lang/Object;)I
}

直觀可見!在類中

TraceClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out));

這一行使用了System.out的輸出,會把上述結果輸送到控制檯。在這裏可以選用別的輸出,例如輸出到文件等。


發佈了54 篇原創文章 · 獲贊 37 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章