java中的字节码,如果你之前没有接触过,那么可能会感觉比较难。
我们先来看几个在开发中都会用到的例子,来增加学习的趣味性。
1. 例子
1.1 switch
我们在开发中经常用会用到switch来判断条件,那么判断字符串是不是像代码写的那么简单呢?是不是直接case 到就可以执行内部的代码呢?让我们来看看它内部的秘密。
public class SwitchClass {
public static void choose(String str) {
switch (str) {
case "hello":
System.out.println("1");
break;
case "one":
System.out.println("2");
break;
default:
System.out.println("3");
break;
}
}
public static void main(String[] args) {
choose("hello");
}
}
通过javap -c SwitchClass.class
反编译,生成的字节码如下,从字节码中我们可以看到,字符串的判断是通过hashCode 来判断的,但是hashCode并不是唯一值,很多字符串生成的Code 是相同的。
我们接下来看字节码,42行发现有一个指令ifeq ,它其实就是if (str.equals(""))
继续往下看发现62行还有一个switch,其实它就是用来具体执行case中写的代码的。
public static void choose(java.lang.String);
Code:
0: aload_0
1: astore_1
2: iconst_m1
3: istore_2
4: aload_1
5: invokevirtual #7 // Method java/lang/String.hashCode:()I
8: lookupswitch {
// 2
110182: 50
99162322: 36
default: 61
}
36: aload_1
37: ldc #13 // String hello
39: invokevirtual #15 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
42: ifeq 61
45: iconst_0
46: istore_2
47