理解javap -c

理解javap -c

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             退出方法






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值