利用字节码解决java中遇到的问题
来源:互联网 发布:淘宝企业店铺能转让吗 编辑:程序博客网 时间:2024/06/05 07:42
很对不起作者,当时看到这篇文章的时候因为有事情忙,所以直接拷贝发到邮箱,这个时候转出来,就找不到出处了,如果哪位找到出处给我留个言,我把出处补上。谢谢
i=0;i=i++为什么等于0这个问题困扰了我好长的一段时间,结果前段时间还试图从虚拟机那个层面进行解释,但无论是线程还是方法调用都不能解释其现象,发现方向性错误,这只是一个语言的特性而已。在java lang spec中提到:
1、java运算符的优先级++符是大于=的。
2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。
也就是说后++符先将自己的值存储起来,然后对变量进行++;
再进行赋值操作,也就是将先存储起来的值赋给变量i,这样的操作就导致了i值被置为0了
对于C和C++来说不一样,在讲到m=i++操作时,C语言是先将i的值赋给了m,然后将i值++,这样i=i++的结果自然就是1了,c的实现中是不存在那个中间的值的存储的。
由于java和c不同的语言特性,导致了i=i++的不同之处,前面的笔记中已经提到,由于java lang spec中的一些细微规定,定坤丹导致其运行结果的不同,我们可以用个例子来看i=i++在jvm中实际的运行过程。
源程序test.java:
public class test {
public test() {
}
public static void main(String[] args) {
int i=0;
i=i++;
}
}
我们用javap来看其实际的虚拟机指令集:
C:\JBuilderX\jdk1.4\bin>javap -c -classpath "d:/" test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: nop
5: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //常数0入栈
1: istore_1 //i赋值,常数值出栈
//至此完成i=0;
2: iload_1 //装载变量i,0入栈
//第2步是特殊的一步,这步将i值先行保存,以备赋值使用
3: iinc 1, 1 //变量值增加,栈内值不变
//至此完成i++
6: istore_1 //i赋值,0出栈。
//至此完成i=i++
7: nop //donothing
8: return
}
对比而言,对于i++而言,i=i++指令多了两步,2和6
其实这两步是赋值符号引起的,有意思的是第二步出现的时机,是在iinc之前,这就是因为java lang spec中规定的。
按照我们对java语法的理解i=i++会先执行 i=i(这时候i=0),然后是i++ (这时候i=1)这样的结果应该是1,但是你自己实际写个程序看看结果,是0.为什么会这样?
这要归结于java语言的实现上,具体文中已经解释的很详细了。看字节码就明白了。注意字节码语法不等于java语法。
先赋值后加加是java语法的规定。
先加加后复制时java语言实现的方式。具体为什么这么实现,要去问sun了。
- 利用字节码解决java中遇到的问题
- 利用字节码解决java中遇到的问题
- 利用字节码解决java中i=i++遇到的问题
- 利用codeception过程中遇到的问题及解决方式
- 利用java技术生成验证码的多种方法及遇到问题的解决
- 开发中遇到字节对齐的问题
- 使用javap工具解决Java中遇到的问题
- java转web项目中遇到的问题及解决
- 网络传输中遇到的字节序问题
- NDK开发中遇到的字节对齐问题
- GC中遇到的问题(字节技术)
- java中遇到的问题...
- java中遇到的问题
- JAVA中遇到的问题
- java中遇到的问题
- 今天遇到的数组问题,解决中。。。
- TankWar中遇到的问题及解决
- 解决android中Asynctask遇到的问题
- HITS算法类PageRank
- Ubuntu16.04安装Pytorch
- convert与cast函数
- Error:Could not get unknown property ‘apkVariantData’ for object of type com.android.build.gradle.in
- 猜数字
- 利用字节码解决java中遇到的问题
- C语言练习题(三)
- NumberUtil
- 纯JS(JavaScript)实现拖拽效果,兼容各大浏览器
- Guitar Pro 7如何删除多余的小节?谁知道?
- thinkPHP获取数组中的重复元素,去除数组中的重复元素
- jenkins HTML Report中文乱码(读取csv文件)
- Dat.gui 使用教程
- Mayan游戏