2013-05-31 7 views
5

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

अब तक मैं सभी बुनियादी आदिम प्रकारों के साथ ऐसा करने में सक्षम हूं लेकिन मैं उसी प्राइमेटिव्स की सरणी को क्रमबद्ध करने पर अटक गया हूं।

उदाहरण के लिए मैं कक्षा विधि आह्वान पुरातन की सरणी प्राप्त करने के लिए:

method.invoke(clazz, (Object[])null); 

यह विधि केवल एक आदिम सरणी int[], double[], float[], char[] आदि वापस आ जाएगी, हालांकि हम नहीं जानते कि जो भी इसे किया जाएगा।

मैं के रूप में

T t = (T)method.invoke(clazz, (Object[])null); 
T[] t = (T[])method.invoke(clazz, (Object[])null); 

एक सामान्य तरह के उपयोग करने की कोशिश की है लेकिन यह नहीं करता है मुझे आदिम सरणी से किसी ऑब्जेक्ट को डाली।

और आप Array.newInstance का उपयोग नहीं कर सकते हैं मानते हैं कि हम इस प्रकार को नहीं जानते हैं।

क्या कोई तरीका है कि मैं प्राइमेटिव्स के इस सरणी को सामान्य रूप से ऑब्जेक्ट सरणी कहने के लिए परिवर्तित कर सकता हूं।

एक सामान्य तरीके से अर्थ है कि सरणी के प्रकार को जानने या जांचने की आवश्यकता के बिना। या मुझे बस सभी आदिम प्रकारों के माध्यम से चक्र बनाना चाहिए और उन सभी को अलग से संभालना चाहिए।

मैं यह दोनों तरीकों से कर सकता हूं एकमात्र कारण यह है कि मैं इसे सामान्य तरीके से करना चाहता हूं, अनावश्यक कोड को काटना है।

अग्रिम धन्यवाद।

+0

+1 महान प्रश्न! –

उत्तर

9

आप Array उपयोगिता वर्ग

public static Object[] toObjectArray(Object array) { 
    int length = Array.getLength(array); 
    Object[] ret = new Object[length]; 
    for(int i = 0; i < length; i++) 
     ret[i] = Array.get(array, i); 
    return ret; 
} 
+1

यह पूरी तरह से काम किया। मैंने कभी नहीं सोचा था कि मैं ऑब्जेक्ट को सरणी के रूप में एक्सेस कर सकता हूं। धन्यवाद। –

0

का उपयोग java.lang.reflect.Array.get() तुम क्या चाहते हो करता है सकते हैं?

+0

आपको getLength() –

+0

की भी आवश्यकता है यह मेरा अगला कदम होगा। यह मुझे सरणी से एक आइटम प्राप्त करने की अनुमति देगा, लेकिन मुझे अभी भी यह जानने की जरूरत है कि इसे पहले उचित सरणी में कैसे स्टोर किया जाए। –

0
Object result = method.invoke(clazz, (Object[])null); 
Class<?> arrayKlazz = result.getClass(); 
if (arrayKlazz.isArray()) { 
    Class<?> klazz = result.getComponentType(); 
    if (klazz == int.class) { 
     int[] intArray = arrayKlazz.cast(result); 
    } 
} 

यह (आदिम) एक वस्तु (result ऊपर) में सरणियों धारण करने के लिए अधिक उपयुक्त लगता है।

+0

इस सहायता से परिणाम से 'ऑब्जेक्ट []' कैसे प्राप्त होगा? –

+0

'ऑब्जेक्ट []' पहले से ही उत्तर दिया गया है। लेकिन 'int []', 'double []' आदि के लिए 'ऑब्जेक्ट [] 'के साथ क्रमबद्धता की समस्या को हल करना थोड़ा दूर चल रहा है। ** ऑब्जेक्ट ** में एक सामान्य सरणी आयोजित की जानी चाहिए। मैं सुझाव देना चाहता हूं कि बहुत अधिक जोर के बिना। यदि कोई ऑब्जेक्ट [] 'कामना करता है - ठीक है। –