首页 > 代码库 > 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文件详解