2015-01-07 6 views
7

मेरे पास यह कोड है। यह क्यों काम नहीं करता है? (कार्य का अर्थ यह है कि यह प्रदर्शित करता है 3) मैं इसे कैसे ठीक कर सकता हूं?जावा एक्सेस प्रतिबिंब के माध्यम से इंटीजर कन्स्ट्रक्टर

Copy faield java.lang.Integer.<init>(java.lang.Integer) 
    java.lang.NoSuchMethodException: java.lang.Integer.<init>(java.lang.Integer) 
     at java.lang.Class.getConstructor0(Class.java:2818) 
     at java.lang.Class.getConstructor(Class.java:1723) 
     at Main.copy(Main.java:7) 
     at Main.main(Main.java:19) 
    3 
    null 

धन्यवाद:

public class Main { 
    public static<V> V copy(V var){ 
     try{ 
      return (V) var.getClass().getConstructor(var.getClass()).newInstance(var); 
     } 
     catch(Exception e){ 
      System.out.println("Copy faield " + e.getMessage() + " "); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public static void main(String[] args) { 
     Integer a = new Integer(3); 
     Integer b = copy(a); 

     System.out.println(a); 
     System.out.println(b); 


    } 
} 

यह आउटपुट है! एक Integer

Integer.class 
int.class 

पूर्णांक के लिए निर्माता एक int पैरामीटर लेता है, नहीं:

+5

पूर्णांक केवल 'int' या' स्ट्रिंग' तर्क कंस्ट्रक्टर्स, कोई 'Integer' कॉपी निर्माता है । प्रतिबिंब के साथ, आप पैरामीटर को स्वचालित रूप से अनबॉक्स नहीं कर सकते हैं। –

+0

फिर यह इंटीजर सी = नया इंटीजर (नया इंटीजर (5)) क्यों काम करता है; – yonutix

+0

आप यहां एक सामान्य विधि में बहुत सारी धारणाएं कर रहे हैं। सभी वर्गों में एक कन्स्ट्रक्टर नहीं होगा जो एक ही कक्षा का मूल्य लेता है। – mikea

उत्तर

5

समस्या यहाँ के बीच अंतर है।

काम करने के लिए अपनी जादू विधि प्राप्त करने के लिए, आपको प्रकार की एक विशेष जांच करने की आवश्यकता होगी, और यदि यह एक रैपर वर्ग है, तो वास्तव में एक ऐसे निर्माता की तलाश करें जिसका पैरामीटर इसी प्रकार का मूल प्रकार है।

तरह से बनाया गया कोई आवरण वर्ग से primatove वर्ग पाने के लिए वहाँ AFAIK - आप एक नक्शे का उपयोग करें और मैपिंग से पॉप्युलेट कर सकते हैं:

private static final Map<Class<?>, Class<?>> MAP = new HashMap<>() {{ 
    put(Integer.class, int.class); 
    put(Long.class, long.class); 
    // etc 
}}; 
फिर अपने विधि में

:

Class<?> type = MAP.containsKey(var.getClass()) ? MAP.get(var.getClass()) : var.getClass(); 
return (V) var.getClass().getConstructor(type).newInstance(var); 

पैरामीटर मान में Integer के रूप में int को पास करना ठीक है - कम से कम ऑटो अनबॉक्सित हो जाता है।

+0

के साथ परीक्षण किया है, तो मुझे यह समस्या आई है, ठीक है, मैं समझता हूं, धन्यवाद। यदि आपको कोई विचार है कि मैं कैसे सामान्य रूप से विधि के उद्देश्य को ध्यान में रखकर चकमा दे सकता हूं। – yonutix

+0

@CosminMihai सुंदरता को संभालने के तरीके के लिए कोड देखें। मेरी क्रिसमस :) – Bohemian

+0

आपको बहुत धन्यवाद, उम्मीद है कि चार आदिम प्रकार के लिए इसी वर्ग चरित्र – yonutix

1

वास्तव में समझने के क्यों "नई पूर्णांक (नई पूर्णांक (5))" काम करता है, जबकि प्रतिबिंब नहीं यह पहला मामला के लिए उत्पन्न बाइट कोड को देखने के लिए उपयोगी होता है:

ICONST_5 
INVOKESPECIAL java/lang/Integer.<init> (I)V 
INVOKEVIRTUAL java/lang/Integer.intValue()I 
INVOKESPECIAL java/lang/Integer.<init> (I)V 

... के रूप में आप देख सकते हैं, "हुड के तहत" इंटीजर की intValue() विधि में एक कॉल किया जा रहा है। तो, जावा कंपाइलर वास्तव में आपके "नए इंटीजर (नया इंटीजर (5))" से "नया इंटीजर (नया इंटीजर (5) .intValue()) का अनुवाद कर रहा है"। इसका मतलब है कि यह कन्स्ट्रक्टर का उपयोग कर सकता है जो एक int लेता है।

क्योंकि जावा कंपाइलर प्रतिबिंब के लिए चर के वास्तविक रनटाइम प्रकार को नहीं जानता है, यह कुछ भी समान नहीं कर सकता है और केवल वास्तविक रनटाइम प्रकार तर्क के साथ एक कन्स्ट्रक्टर की तलाश कर सकता है।

+0

मुझे लगता है कि अगर मैं उन विशेष मामलों को हल करने के लिए बयान या इंटीजर, फ्लोट, डबल और लांग क्लास के लिए स्विच करता हूं तो – yonutix

2

किसी ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट पर कॉपी करने का सामान्य दृष्टिकोण। यह उपयोग वर्ग पैकेज में उपलब्ध है - org.apache.commons.lang3।

Integer c = (Integer) SerializationUtils.clone(a); 
+0

सीरियलाइजेशन मानक लाइब्रेरी में नहीं है, मैं कुछ अच्छा ढूंढ रहा था। – yonutix

+0

परिपक्व लाइब्रेरी का उपयोग करना, जो कि पहले से ही कई उपयोगकर्ताओं द्वारा उपयोग किया जाता है और बड़ी परियोजनाएं आपके द्वारा कुछ घंटों में एक साथ रखने की तुलना में बहुत अच्छी है। एकदम मेरे विचार। –

-1

पूर्णांक एक प्रकार है, लेकिन पूर्णांक एक आवरण (वर्ग) कई fonction के साथ एक वस्तु के रूप में है कि उपयोग पूर्णांक है

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