javap -c 找不到类

一, javap实际应用

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

javap -c 找不到类_第1张图片

 

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

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

javap -c 找不到类_第2张图片

解决办法:

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

javap -c 找不到类_第3张图片

 

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

 

你可能感兴趣的:(java基础)