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的輸出,會把上述結果輸送到控制檯。在這裏可以選用別的輸出,例如輸出到文件等。