通过字节码分析switch语句的执行

简介: 通过字节码分析switch语句的执行

先看一段代码

public class Test {
    public static void main(String[] args) {
        int i = 7;
        switch (i) {
            case 1:
                System.out.println("1");
            default:
                System.out.println("2");
            case 3:
                System.out.println("3");
        }
    }
}

运行结果
2
3


通过javap -c Test.class查看字节码文件

Compiled from "Test.java"
public class com.rsms.iot.service.Test {
  public com.rsms.iot.service.Test();
    Code:
       0: aload_0                //加载一个对象引用到操作数栈,在这里第一个变量是this,所以是将this引用压到操作数栈
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V (构造方法、私有方法和父类中的方法)
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: bipush        7    //将操作数7压到操作数栈中
       2: istore_1     //将整形数字存储到本地变量中
       3: iload_1      //i代表int,从局部变量数组中加载一个对象引用到操作数栈的栈顶
       4: lookupswitch  { // 2   
                     1: 32   //为1匹配32行
                     3: 48   //同上
               default: 40   //同上
          }
      32: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      35: ldc           #3                  // String 1
      37: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      40: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      43: ldc           #5                  // String 2
      45: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      48: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      51: ldc           #6                  // String 3
      53: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      56: return
}


先分析下字节码文件(局部变量表和操作数栈都属于当前栈帧,内存模型我在CSDN一篇博客中整理过:https://mp.csdn.net/postedit/68945933


0:aload_0   会将this变量压到操作数栈中


0: bipush   初始化将变量推送至操作数栈栈顶


2: istore_1 将整形变量存储到本地局部变量表中位置为1的变量中


3: iload_1  将局部变量表中位置为1的变量的引用压到操作数栈中(个人理解是每次调用都会将变量的引用进行一次操作数栈的压栈操作),比如如下代码会有一次istore_1指令,两次iload_1指令。


int i = 7;
System.out.println(i);
System.out.println(i);


image.png


指令执行图示


从字节码文件可以看出,即使default在中间,编译后还是会在最后。所以匹配不到1、3时执行default,跳转到40行,40print执行之后,由于没有break语句,所以会顺序往下执行,会继续执行40行之后的所有语句。


相关文章
|
8月前
|
Python
循环结构程序设置
循环结构程序设置
61 0
|
8月前
|
Java
Java的控制流程语句:深入理解条件语句、循环语句与跳转语句
Java的控制流程语句:深入理解条件语句、循环语句与跳转语句
78 1
|
5月前
|
Java
在Java编程的广阔天地中,条件语句是控制程序流程、实现逻辑判断的重要工具。
在Java编程中,if-else与switch作为核心条件语句,各具特色。if-else以其高度灵活性,适用于复杂逻辑判断,支持多种条件组合;而switch在多分支选择上表现优异,尤其适合处理枚举类型或固定选项集,通过内部跳转表提高执行效率。两者各有千秋:if-else擅长复杂逻辑,switch则在多分支选择中更胜一筹。理解它们的特点并在合适场景下使用,能够编写出更高效、易读的Java代码。
42 1
|
7月前
|
Java C++ Python
选择、条件、循环语句是编程语言中用于控制程序流程的重要语句。
选择、条件、循环语句是编程语言中用于控制程序流程的重要语句。
|
8月前
|
算法 程序员 C++
C++程序中的循环结构:控制程序重复执行的关键
C++程序中的循环结构:控制程序重复执行的关键
175 2
|
8月前
|
存储 索引
操作数栈的字节码指令执行分析
操作数栈的字节码指令执行分析
|
JavaScript 前端开发 Java
图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?
图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?
384 0
图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?
|
存储 Java 编译器
「作者推荐」【JVM原理探索】字节码指令集调用执行流程分析(语法分析篇)
「作者推荐」【JVM原理探索】字节码指令集调用执行流程分析(语法分析篇)
132 0
「作者推荐」【JVM原理探索】字节码指令集调用执行流程分析(语法分析篇)
|
编译器 C++
有的编译器,for (i=1; i 《 1; i++)会执行循环体
有的编译器,for (i=1; i 《 1; i++)会执行循环体
77 0
|
Java
Java中的while、do...while循环结构及跳转控制语句和循环嵌套
while、do...while循环结构及跳转控制语句和循环嵌套的简单示例
117 0

热门文章

最新文章