在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下。
下面将详细介绍一下java是if 条件判断是如何通过字节码来实现判读的。以下是java条件判断对应的字节码:
指令 | 助记符 | 含义 |
---|---|---|
0x99 | ifeq | 判断是否 == 0 |
0x9a | ifne | 判断是否 != 0 |
0x9b | iflt | 判断是否 < 0 |
0x9c | ifge | 判断是否 >= 0 |
0x9d | ifgt | 判断是否 > 0 |
0x9e | ifle | 判断是否 <= 0 |
0x9f | if_icmpeq | 两个int 是否 == |
0xa0 | if_icmpne | 两个int 是否 != |
0xa1 | if_icmplt | 两个int 是否 < |
0xa2 | if_icmpge | 两个int 是否 >= |
0xa3 | if_icmpgt | 两个int 是否 > |
0xa4 | if_icmple | 两个int 是否 <= |
0xa5 | if_acmpeq | 两个引用是否 == |
0xa6 | if_acmpne | 两个引用是否 != |
0xc6 | ifnull | 判断是否 == null |
0xc7 | ifnonnull | 判断是否 != null |
几点说明:
- byte,short,char 都会按int比较,因为操作数栈都是4字节
- goto 用来进行跳转到指定行号的字节码
java 条件判断源码:
// 从字节码角度来分析:条件判断指令
public class T04_ByteAnalyseIf {
public static void main(String[] args) {
int a = 0;
if (a == 0) {
a = 10;
} else {
a = 20;
}
}
}
字节码:使用javap -v T04_ByteAnalyseIf.class,将java程序对应的字节码如下,并做了执行的注释。
0: iconst_0 // int型常量值0进操作数栈
1: istore_1 // 从操作数栈弹出数据存储局部变量表1号槽位
2: iload_1 // 从局部变量表1号槽位中加载数据到操作数栈中
3: ifne 12 // 当栈顶int型数值不等于0时跳转到12行
6: bipush 10 // 将一个byte型常量值10 推送至栈顶
8: istore_1 // 将栈顶int型数值存入第二个局部变量,从0开始计数
9: goto 15 // 跳转到15行
12: bipush 20 // 将一个byte型常量值20 推送至栈顶
14: istore_1 // 将栈顶int型数值存入第二个局部变量,从0开始计数
15: return // 当前方法返回void
思考:以上比较指令中没有long, float, double 的比较,那么它们要比较怎么办?
官网参考链接:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.1lcmp
文章最后,给大家推荐一些受欢迎的技术博客链接:
- Hadoop相关技术博客链接
- Spark 核心技术链接
- JAVA相关的深度技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!
来源:oschina
链接:https://my.oschina.net/u/4311964/blog/4493002