2013-05-09 17 views
9

मैं सिर्फ तलाश रहा है जावा प्रतिबिंब एपीआई और मैं निम्नलिखित आई कोड स्निपेटजावा प्रतिबिंब स्निपेट उत्पादन

public class Main { 
    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException{ 
      Field value=Integer.class.getDeclaredField("value"); 
      value.setAccessible(true); 
      value.set(42, 43); 

      System.out.printf("six times seven %d%n",6*7); 
      System.out.printf("six times seven %d%n",42); 
      System.out.println(42); 
     } 
    } 

आउटपुट:

six times seven 43 
six times seven 43 
42 

मैं सेट विधि जिसमें कहा गया है की दस्तावेज़ पढ़ें यह मूल्य सेट है कि दिए गए वस्तु के लिए क्षेत्र का। लेकिन मैं कोड के आउटपुट को समझने में सक्षम नहीं हूं क्योंकि इसे सभी मामलों में 42 प्रिंट करना चाहिए।

क्या कोई भी कोड में क्या हो रहा है में अंतर्दृष्टि दे सकता है?

+1

http://www.dzone.com/snippets/reflection-integer-destroyer –

उत्तर

4
 System.out.println(42); 

println(int) नहीं println(Object) बुला रहा है। मुक्केबाजी कभी नहीं होती है। इससे यह तेज़ हो जाता है, और 1.5 से पहले भी काम करता है।

अन्य मामलों में, आप Integer.valueOf(int) के माध्यम से मुक्केबाजी कर रहे हैं। इस विधि को हमेशा 1212 और 127 समावेशी (अन्य मानों के लिए समान व्यवहार नहीं हो सकता है) के बीच मूल्यों के लिए बिल्कुल उसी Integer ऑब्जेक्ट्स को वापस लौटने के रूप में परिभाषित किया गया है। तो जहां भी आपके प्रोग्राम में 42 को बॉक्स किया गया है, आपको वही वस्तु मिल जाएगी, और जब आप इस ऑब्जेक्ट में value का मान सेट करते हैं तो इससे कोई फर्क नहीं पड़ता कि यह किस संदर्भ में पढ़ा जाता है।

आप स्पष्ट रूप से कोड में मुक्केबाजी में डाल करने के लिए थे, तो यह इस प्रकार दिखाई देगा:

 value.set(Integer.valueOf(42), 43); 

     System.out.printf("six times seven %d%n",Integer.valueOf(6*7)); 
     System.out.printf("six times seven %d%n",Integer.valueOf(42)); 
     System.out.println(42); 

हम Integer.valueOf( रिटर्न 42 के लिए वास्तव में एक ही वस्तु जानते हैं, कोड को प्रभावी ढंग से है:

 Integer obj42 = Integer.valueOf(42); 

     value.set(Integer.valueOf(obj42, 43); 

     System.out.printf("six times seven %d%n", obj42); 
     System.out.printf("six times seven %d%n", obj42); 
     System.out.println(42); 
+0

समझना थोड़ा मुश्किल है। क्या आप कृपया मुझे कुछ संदर्भ दे सकते हैं जहां मुझे और जानकारी मिल सकती है? – ankurtr

+0

@ ankur.trapasiya मुक्केबाजी का? विवरण 'Integer.valueOf' और जेएलएस में एपीआई दस्तावेज़ों में हैं। –

+0

@ ankur.trapasiya [[यहां] (http://stackoverflow.com/questions/3130311/weird-java-boxing)] आपके पास मुक्केबाजी और कैशिंग इंटीजर्स के बारे में दिलचस्प सवाल है। चूंकि 'printf (स्ट्रिंग प्रारूप, ऑब्जेक्ट ... तर्क)' ऑब्जेक्ट्स की आवश्यकता है क्योंकि 'प्रारूप' जावा में उपयोग किए गए तर्क 'int'' को 'इंटीजर' से ऑटोबॉक्स करेंगे, लेकिन चूंकि आपने 42 से 43 का प्रतिनिधित्व करने वाले कैश किए गए 'इंटेगर' का मान बदल दिया है, यह मान मुद्रित किया जाएगा। 'println (int) 'में यह समस्या नहीं है क्योंकि इसे मुक्केबाजी की आवश्यकता नहीं है। आप 'System.out.printf (" छह गुणा सात% डी% एन ", नया इंटीजर (6 * 7)) भी कोशिश कर सकते हैं;' मूल्य 42 के साथ नया इंटीजर बनाने के लिए जो कैश नहीं किया जाएगा – Pshemo

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