簡體   English   中英

Java 7 String switch反編譯:意外指令

[英]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語句是一個兩步過程。

  1. 計算switch字符串的hashcode並在case語句中查找'hashcode match',這是通過LOOKUPSWITCH完成的。 注意LOOKUPSWITCH下的大整數,這些是case語句中字符串的哈希碼。
  2. 現在2個字符串可以具有相同的哈希碼,但不太可能。 因此,仍然必須進行實際的字符串比較。 因此,一旦匹配哈希碼,就將交換機字符串與匹配的case語句中的字符串進行比較。 LOOKUPSWITCH和TABLESWITCH之間的指令就是這樣做的。 確認匹配后,將通過TABLESWITCH訪問匹配的case語句要執行的代碼。

另請注意,指定您使用的編譯器是有用的 - javac或ECJ (Java的Eclipse編譯器)。 兩個編譯器都可能以不同方式生成字節碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM