盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

使用asm打印类的字节码信息

分享牛 1926℃

前面一系列文章说明了,如何使用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打印类的字节码信息