javap -c 找不到类

一, javap实际应用

这个是在分析++i i++的区别时用到的, 都知道一个先加1再做别的事情, 另一个与之相反, 至于为什么这样, 只有具体分析对应的字节码了。

 

1, javap -c 处理该java类,却提示找不到类

cmd --> 进入JavapTest.java所在的位置  -->javap -c JavapTest

解决办法:

先运行指令: javac JavapTest.java 生成对应的class文件, 之后再进行javap -c操作

 

2, ++j和j++对应字节码分析

(这个是在公众号《码农翻身》的星球里看到的,来自刘大大的分析,直接粘过来用了)

我们把程序简化成这样:

int j = 0;

j = j ++;

System.out.println(j);

然后用javap去处理,得到结果如下:

0: iconst_0  //把数值0 放到栈顶

1: istore_1  //把栈顶的值(0)放到局部变量表中index为1的地方(表示变量j)

2: iload_1   //把局部变量表中index为1的变量(j)放到栈顶

3: iinc          1, 1  //把局部变量表中index为1的变量增加1, 现在变量j 为1

6: istore_1            //把栈顶的值(0)保存到放到局部变量表中index为1的地方(此时j又变成了0)

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

10: iload_1        //  j 还是0

11: invokevirtual #22                 // Method java/io/PrintStream.println:(I)V

14: return

可见字节码中只是对局部变量表做了加一操作,栈顶的值没有变, 等把栈顶的值写回局部变量表,就把加过1的值覆盖掉了。 所以j一直是0 。

 

如果把代码改成这样:

int j = 0;

j = ++j;

System.out.println(j);

对应的字节码是:

 0: iconst_0   //把数值0放到栈顶

 1: istore_1   //把栈顶的值弹出,放到局部变量表为1的地方(j=0)

 2: iinc          1, 1   //把局部变量表中的j 增加1

 5: iload_1              // 把j 放到栈顶

 6: istore_1             // 把栈顶的值弹出,放到局部变量表为1的地方(j=1)

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

10: iload_1

11: invokevirtual #22  // Method java/io/PrintStream.println:(I)V

14: return

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值