首页 > 代码库 > javap文件详解

javap文件详解

2014年8月29日



参考书籍:深入理解java虚拟机



我们可以用javap -verbose 字节码     来直观的查看字节码文件,

参考我在《常量池》中的描述,很容易就可以看得懂javap结果中的常量池。



那么方法区呢?应该怎么看?这部分在我的参考书籍中有详细的描述,下边,我总结性的描述一下。


为了能够看到方法的局部变量,

在编译的时候,用javac -g:vars *.java



源文件:

class Father

{

int a=3;

final static long b=System.currentTimeMillis();

static

{

}

Father()

{

a=3;

}

void method(int a)

{

final int hw=9;

System.out.println("father int");

}

}


javap之后,常量池下边的内容。

{


int a;


static final long b;


//这个方法是这个类的构造器,.就是这个类的<init>,不仅仅只有你定义的构造函数

Father();//方法简单名字,方法描述符。。。。看看,是不是对应着方法表的结构。

  Code://最重要的属性

   Stack=2, Locals=1, Args_size=1//操作数栈的最大深度,局部变量表的大小(slot),这个方法的参数个数

   0:   aload_0  //这个aload_0 你必须知道,就是把第一个引用型本地变量推到栈顶。(本地变量在LocalVariableTable中可以看到)

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V//这一条,你看,确实是一条指令后边跟着一个符号引用吧,对应于我的《类的加载详解》中的解析描述。

   4:   aload_0

   5:   iconst_3

   6:   putfield        #2; //Field a:I

   9:   aload_0

   10:  iconst_3

   11:  putfield        #2; //Field a:I

   14:  return

  LineNumberTable://是源代码行号与字节码行号的对应,

   line 20: 0

   line 12: 4

   line 21: 9

   line 22: 14

  LocalVariableTable://局部变量表中的变量与源码中定义的变量的关系

Start  Length  Slot  Name   Signature

 0      15      0    this      LFather;




//自定义方法

void method(int);

  Code:

   Stack=2, Locals=3, Args_size=2

   0:   bipush  9

   2:   istore_2

   3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;

   6:   ldc     #4; //String father int

   8:   invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   11:  return

  LineNumberTable:

   line 25: 0

   line 26: 3

   line 27: 11

  LocalVariableTable:

   Start  Length  Slot  Name   Signature

   0      12      0    this       LFather;

   0      12      1    a       I

   3      9      2    hw       I



//<clinit>

static {};

  Code:

   Stack=2, Locals=0, Args_size=0

   0:   invokestatic    #7; //Method java/lang/System.currentTimeMillis:()J

   3:   putstatic       #8; //Field b:J

   6:   return

  LineNumberTable:

   line 13: 0

   line 17: 6



}


本文出自 “厚积薄发” 博客,请务必保留此出处http://duanzhenyue.blog.51cto.com/9360091/1550108

javap文件详解