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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章