javap是sun提供的对class文件进行反编译的工具,javap就和javac、java等命令用法类似。
javap最常用的参数是c,也就是javap -c test 其中,test是test.java文件经javac编译后产生的class文件名一个例子
public class TestJavap {
public static void main(String[] args) {
int i=0;
i = i++ + ++i;
System.out.println(i);
}
}
$ javac TestJavap.java
$ javap -c TestJavap
Compiled from "TestJavap.java"
public class TestJavap extends java.lang.Object{
public TestJavap();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: iinc 1, 1
9: iload_1
10: iadd
11: istore_1
12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
15: iload_1
16: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
19: return
解释如下
int i = 0;
i=i++ + ++i;
Code:
0: iconst_0 将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
1: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 。对应赋值语句,上句是赋值,这句是存储,索引1处即为i,因为没有其它变量,所以本例中局部变量的索引不变
2: iload_1 将局部变量表索引 1 处的值推到堆栈中。将局部变量索引1处的计算结果推入堆栈临时存储,局部变量的索引从1开始,依此类推,这句意味着将变量i=0先推入堆栈临时存储
3: iinc 1, 1 局部变量表索引 1 处的变量加 1 。将变量i自加1,则此时变量i为1
6: iinc 1, 1 局部变量表索引 1 处的变量加 1 。再将变量i自加1,则此时变量i为2
9: iload_1 将局部变量表索引 1 处的值推到堆栈中。将变量i=2推入堆栈临时存储
10: iadd 从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的整数相加,即0+2=2
11: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处。把上步相加之结果弹出堆栈
12: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 对应System.out
15: iload_1 加载i//将变量i=2推入堆栈临时存储
16: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 对应println
19: return 退出方法
---------------------
作者:csdn
来源:CSDN
原文:https://blog.csdn.net/shangpusp/article/details/7320333?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!