美文网首页技术
通过字节码分析switch语句的执行

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

作者: 那些年搬过的砖 | 来源:发表于2018-12-21 10:55 被阅读0次
先看一段代码
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);
指令执行图示
从字节码文件可以看出,即使default在中间,编译后还是会在最后。所以匹配不到1、3时执行default,跳转到40行,40print执行之后,由于没有break语句,所以会顺序往下执行,会继续执行40行之后的所有语句。

相关文章

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

    先看一段代码 通过javap -c Test.class查看字节码文件 先分析下字节码文件(局部变量表和操作数栈都...

  • JVM-06

    switch-case的字节码指令: Java代码如下: 字节码指令如下: 结论是:switch-case 语句 ...

  • 6_分支语句

    关键字:if语句分析、 switch语句分析 1. if语句分析 if语句用于根据条件选择执行语句 else不能独...

  • JVM知识精粹

    1.jvm执行字节码文件 流程:jvm通过类加载器加载字节码文件----字节码校验器---翻译字节码(解释执行,反...

  • js2-switch语句 for循环 break和continu

    switch语句 执行到break就结束switch语句 执行过程switch语句根据传入的值进行对比, 匹配ca...

  • 《深入理解JVM虚拟机》 - 运行期优化

    javac生成字节码,字节码可以解释执行,也可以进一步通过JIT编译执行,JIT把字节码变为机器码。 JVM采用解...

  • runoob js第四天

    JavaScript switch 语句 switch 语句用于基于不同的条件来执行不同的动作。用 switch ...

  • javaScript的switch语句

    switch语句用于基于不同的条件来执行不同的动作。 javaScript switch语句 语法: switch...

  • Go语法基础-判断和循环

    条件语句 if if...else... if语句嵌套 switch switch 语句用于基于不同条件执行不同动...

  • 静态代码扫描工具

    静态代码扫描工具/引擎对比: 序号引擎分析对象备注1Findbugs字节码缺陷模式匹配、数据流分析。通过字节码分析...

网友评论

    本文标题:通过字节码分析switch语句的执行

    本文链接:https://www.haomeiwen.com/subject/qtcmkqtx.html