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的输出,会把上述结果输送到控制台。在这里可以选用别的输出,例如输出到文件等。