前面一系列文章说明了,如何使用16进制的方式阅读字节码以及使用javap命令生成可阅读的字节码,但是这两种方式,貌似都是都点麻烦,不太灵活,看一个类的字节码信息还要打开控制台手动javap一下,所幸asm提供了一系列的工具类,都在都在org.objectweb.asm.util包中,本文看一下TraceClassVisitor类的使用。
我们还是以前面章节中的Person类为例进行说明,示例代码如下:
ClassReader cr = new ClassReader("com.shareniu.asm.helloword.Person"); ClassWriter cw = new ClassWriter(0); TraceClassVisitor tcv=new TraceClassVisitor(cw,new PrintWriter(System.out)); cr.accept(tcv, 0);
TraceClassVisitor 接受的参数有一个ClassWriter以及PrintWriter,在在这里我们直接将其打印到控制台,输出如下:
// class version 52.0 (52) // access flags 0x21 public class com/shareniu/asm/helloword/Person { // compiled from: Person.java // access flags 0x2 private I id // access flags 0x2 private Ljava/lang/String; name // access flags 0x1 public <init>()V L0 LINENUMBER 3 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init> ()V RETURN L1 LOCALVARIABLE this Lcom/shareniu/asm/helloword/Person; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x1 public getId()I L0 LINENUMBER 7 L0 ALOAD 0 GETFIELD com/shareniu/asm/helloword/Person.id : I IRETURN L1 LOCALVARIABLE this Lcom/shareniu/asm/helloword/Person; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x1 public setId(I)V L0 LINENUMBER 10 L0 ALOAD 0 ILOAD 1 PUTFIELD com/shareniu/asm/helloword/Person.id : I L1 LINENUMBER 11 L1 RETURN L2 LOCALVARIABLE this Lcom/shareniu/asm/helloword/Person; L0 L2 0 LOCALVARIABLE id I L0 L2 1 MAXSTACK = 2 MAXLOCALS = 2 // access flags 0x1 public getName()Ljava/lang/String; L0 LINENUMBER 13 L0 ALOAD 0 GETFIELD com/shareniu/asm/helloword/Person.name : Ljava/lang/String; ARETURN L1 LOCALVARIABLE this Lcom/shareniu/asm/helloword/Person; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x1 public setName(Ljava/lang/String;)V L0 LINENUMBER 16 L0 ALOAD 0 ALOAD 1 PUTFIELD com/shareniu/asm/helloword/Person.name : Ljava/lang/String; L1 LINENUMBER 17 L1 RETURN L2 LOCALVARIABLE this Lcom/shareniu/asm/helloword/Person; L0 L2 0 LOCALVARIABLE name Ljava/lang/String; L0 L2 1 MAXSTACK = 2 MAXLOCALS = 2 }
后续我们就开始详细讲解这些指令的含义了,在这里先做前期的准备工作。
转载请注明:分享牛 » 使用asm打印类的字节码信息