2011-08-05 12 views
12

मैंने एक बहुत ही सरल वर्ग को संकुचित कर दिया है जो नई जावा 7 स्ट्रिंग स्विच सुविधा का उपयोग करता है।जावा 7 स्ट्रिंग स्विच decompiled: अप्रत्याशित निर्देश

वर्ग:

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; 
     } 

    } 

} 

इस वर्ग के खिलाफ जावा 7 "javap" चल रहा है, (पूरा disassembled कोड उपलब्ध है here) निर्देश का एक दिलचस्प सेट उत्पन्न करता है:

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 

" लुकुप्सविच "एक निर्देश है जब स्विच केस स्पैस होता है और टैबलेटविच को प्रतिस्थापित कर सकता है, जो" स्विच "कथन के लिए डिफ़ॉल्ट निर्देश है।

तो सवाल यह है कि हम "लुकस्विच" के बाद "लुकस्विच" क्यों देख रहे हैं?

धन्यवाद लुसियानो

उत्तर

15
सही मामले बयान ढूँढने स्विच में तार के साथ

2 चरणों वाली प्रक्रिया है।

  1. स्विच स्ट्रिंग के हैशकोड की गणना करें और केस स्टेटमेंट्स के बीच 'हैशकोड मैच' देखें, यह लुकअपविच के माध्यम से किया जाता है। LOOKUPSWITCH के तहत बड़ी पूर्णांक संख्याओं पर ध्यान दें, ये बयान के मामले में तारों के हैशकोड हैं।
  2. अब 2 तारों में एक ही हैशकोड हो सकता है, हालांकि यह संभव नहीं है। इसलिए वास्तविक स्ट्रिंग तुलना अभी भी होनी चाहिए। इसलिए हैशकोड मिलान होने के बाद, स्विच स्ट्रिंग की मिलान मिलान केस स्टेटमेंट में स्ट्रिंग के साथ की जाती है। लुकुप्सविच और टैबलेटविच के बीच निर्देश बिल्कुल यही करते हैं। एक बार मैच की पुष्टि हो जाने के बाद, मेल किए गए केस स्टेटमेंट के लिए निष्पादित कोड को टैबलेटविच के माध्यम से पहुंचाया जाता है।

यह भी ध्यान रखें कि यह निर्दिष्ट करने के लिए उपयोगी है कि आपने किस कंपाइलर का उपयोग किया - जैवैक या ECJ (जावा के लिए ग्रहण कंपाइलर)। दोनों कंपाइलर्स बाइटकोड अलग-अलग उत्पन्न कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। यह समझ में आता है। –

संबंधित मुद्दे