2012-11-15 20 views
22

यहां एक चर Class<?> cls है, अब मैं एक और Array Class Object प्राप्त करना चाहता हूं जो घटक प्रकार cls है।जावा के बारे में: 'स्ट्रिंग.क्लास' से 'स्ट्रिंग []। कक्षा` प्राप्त करें, क्या होगा यदि' स्ट्रिंग.क्लास 'एक "रनटाइम प्रकार" है?

उदाहरण के लिए, यदि cls = String.class, मैं String[].class प्राप्त करना चाहता हूं; यदि cls = int.class, मैं int[].class प्राप्त करना चाहता हूं, तो मुझे क्या करना चाहिए?

तुम देखो, यह String[].class से String.class प्राप्त करने के लिए काफी आसान है:

Class<?> arrayCls = String[].class; 
if(arrayCls.isArray()){ 
    Class<?> cls = arrayCls.getComponentType(); 
} 

लेकिन मैं रिवर्स करने के लिए आसान तरीका नहीं मिल रहा।

Class<?> clazz = String.class; 
Class<?> arrayClass = Array.newInstance(clazz,0).getClass(); 

है वहाँ किसी भी बल्लेबाज जिस तरह से कृपया ऐसा करने के लिए:

यहाँ एक संभव समाधान है?

+1

उस समाधान के साथ क्या गलत है? – Thilo

+0

@ थिलो समाधान मेरे अनुमान का परिणाम है। यह ठीक काम करता है, लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है या नहीं। इस समाधान को एक सरणी इकाई बनाने की गतिशीलता की आवश्यकता है जो लंबाई 0. – watchzerg

+0

दिलचस्प सवाल है। बस जिज्ञासा है कि आपको सरणी 'कक्षा' ऑब्जेक्ट की आवश्यकता क्यों है? –

उत्तर

8

शायद Class.forName(String) आज़माएं?

संपादित करें: यहां एक कोड स्निपेट है।

Class<?> arrayClass = String[].class; 
System.out.println(arrayClass); 
Class<?> namedClass = Class.forName("[L" + String.class.getName() + ";"); 
System.out.println(namedClass); 
System.out.println(arrayClass == namedClass); 
+1

जेडीके में एक्सएमएलएनकोडर क्लास के अनुसार, 'क्लास.forनाम (स्ट्रिंग)' ऐसा करने का मानक तरीका है। धन्यवाद दोस्त। 'कक्षा सीएलएस = स्ट्रिंग.क्लास; कक्षा arrayCls = class.forName ("[एल" + cls.getName() + ";"); 'http://stackoverflow.com/questions/4581394/getting-the-class-of-an-n-dimensional -एरे-ऑफ़-रनटाइम-सप्लाई-क्लास-नाम – watchzerg

+0

आह। मैं अंत में अर्धविराम के बारे में भूल गया। – zienkikk

+2

व्यक्तिगत रूप से मैं 'Array.newInstance' का उपयोग करके अपना समाधान पसंद करता हूं। यह कम से कम दस्तावेज सुविधाओं का उपयोग करता है। लेकिन उपसर्ग '[एल' नाम एक आंतरिक सम्मेलन है। भविष्य में वे इसे बदल सकते हैं और 'एक्सएमएलएनकोडर' वर्ग बदल सकते हैं, क्योंकि यह जेडीके का भी हिस्सा है। सिर्फ इसलिए कि जेडीके में किसी निश्चित तरीके से कुछ ऐसा करता है, इसका मतलब यह नहीं है कि आपको ऐसा करना चाहिए, क्योंकि आप जेडीके कोड के बजाय आवेदन कोड लिख रहे हैं। – Kidburla

11

मुझे मिली एक और चाल उपयोग विधि पर varargs का उपयोग कर रही है।

public static void main(String[] args) throws ClassNotFoundException { 

    Class<?> demo = Main.<String>getArrayClass(); 
    System.out.println(demo); 
} 

static <T> Class getArrayClass(T... param){ 
    return param.getClass(); 
} 
+1

अच्छा चाल +1 वास्तव में यदि आप कॉल साइट पर 'टी' निर्दिष्ट करते हैं तो किसी भी तर्क को पारित करने की आवश्यकता नहीं है:' MyClass। getArrayClass(); ' –

+0

हाँ अच्छी युक्ति :) मैंने अपडेट किया है! – HRgiger

+4

यह रनटाइम प्रकार मिटाए जाने के कारण हर बार ऑब्जेक्ट [] 'की कक्षा क्यों नहीं लौटाएगा? – SpaceTrucker

10

HRgiger के जवाब में सुधार:

@SuppressWarnings("unchecked") 
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) { 
    return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass(); 
} 

उन दोनों जब लागू एक सरणी वस्तु का दृष्टांत। सरणी प्रकार प्राप्त करने के लिए,

Class<?> childType = ...; 
Class<?> arrayType = getArrayClass(childType); 
+0

इसका एचआरजीगर के उत्तर से कोई लेना देना नहीं है, यह प्रश्न में ओपी ने क्या पोस्ट किया है इसका एक सुधार है। – Holger

+0

इसके अलावा, मुझे पूरा यकीन है कि आप यहां एक नई वस्तु को तत्काल कर रहे हैं, हर बार, जिसका दूसरा जवाब नहीं है। –