[英]Java 7 String switch decompiled: unexpected instruction
我已經反編譯了一個使用新的Java 7字符串切換功能的非常簡單的類。
班級:
public class StringSwitch {
public static void main(String[] args) {
final String color = "red";
switch (color) {
case "red":
System.out.println("IS RED!");
break;
case "black":
System.out.println("IS BLACK");
break;
case "blue":
System.out.println("IS BLUE");
break;
case "green":
System.out.println("IS GREEN");
break;
}
}
}
針對此類運行Java 7“javap”,會生成一組有趣的指令(完整的反匯編代碼可在此處獲得 ):
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
...
12: lookupswitch { // 4
112785: 56
3027034: 84
93818879: 70
98619139: 98
default: 109
}
56: aload_2
57: ldc #2 // String red
...
110: tableswitch { // 0 to 3
0: 140
1: 151
2: 162
3: 173
default: 181
}
140: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
143: ldc #9 // String IS RED!
...
181: return
“LOOKUPSWITCH”是一個指令,當開關盒稀疏時可以替換TABLESWITCH,這是“switch”語句的默認指令。
所以,問題是,為什么我們看到“LOOKUPSWITCH”后跟“TABLESWITCH”?
謝謝盧西亞諾
使用switch中的字符串查找正確的case語句是一個兩步過程。
另請注意,指定您使用的編譯器是有用的 - javac或ECJ (Java的Eclipse編譯器)。 兩個編譯器都可能以不同方式生成字節碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.