2010-08-04 15 views
8

मैं प्रतिबिंब का उपयोग कर रहा इस जैसे एक उदाहरण क्षेत्र को पुनः प्राप्त करने के पुरातन की एक सरणी पुनः प्राप्त करने के प्रतिबिंब का उपयोग करना:एक अज्ञात प्रकार

private int[] numbers = .... 
क्षेत्र वस्तु के साथ

, मैं देख सकते हैं कि क्षेत्र एक सरणी शामिल और यदि ऐसा होता है, तो मैं सरणी में स्याही पर लूप करना चाहता हूं।

field.setAccessible(true); 
Object value = field.get(foo); 

ऊपर मूल्य चर ints की मेरी सरणी में शामिल होंगे: तो अगर उद्देश्य यह है कि इसके बाद के संस्करण फ़ील्ड में "foo" कहा जाता है, तो मैं कुछ इस तरह होगा। मैं उस ऑब्जेक्ट को नियमित सरणी की तरह कैसे मानूं और इसके मूल्यों पर पुन: प्रयास करूं?

संपादित करें: क्षमा करें, मुझे उपरोक्त मेरी कहानी के लिए एक महत्वपूर्ण बिंदु याद आया। मैं ऊपर एक सामान्य तरीके से कर रहा हूं इसलिए मुझे नहीं पता कि सरणी में कौन सा आदिम है। यह एक int [] या लंबा [] आदि हो सकता है तो int [] को कास्टिंग लंबे समय तक [] मामले में काम नहीं करेगा। उफ़!

उत्तर

12

की तरह एक सरणी के लिए यह डाल सकता है आप लंबाई और एक सरणी के व्यक्तिगत तत्वों का उपयोग करने के वर्ग java.lang.reflect.Array उपयोग कर सकते हैं। get विधि को सामान्य तरीके से काम करना चाहिए, संभवतः अपने रैपर ऑब्जेक्ट्स में प्राइमेटिव को लपेटना चाहिए।

+0

मैं देख सकता हूं कि प्राप्त विधि किसी निश्चित अनुक्रमणिका पर मान पुनर्प्राप्त करेगी, हालांकि, आप सरणी की लंबाई कैसे प्राप्त करते हैं? – digiarnie

+3

@ डिजीइर्नी, विधि अन्य गेटर्स के बीच जावाडोक में थोड़ी सी छिपी हुई है, यह 'ऐरे .getLength (ऑब्जेक्ट सरणी) ':) –

+0

हाँ है जो वही है जो मैं चाहता था और हाँ आप सही हैं, यह उन सभी के बीच छिपा हुआ था अन्य गेटर्स और मैं बस इसे याद किया! धन्यवाद! – digiarnie

1

This page "Arrays का उपयोग" अनुभाग के तहत एक अच्छा उपचार है।

को सरल बनाना (और उनके array2 उदाहरण वर्ग से चर नाम बदल रहा है ;-),

int valuecast[] = (int[])value; 

होने के लिए क्या आप के बाद कर रहे हैं लगता है।

संपादित: ओपी अब स्पष्ट किया है कि वह चाहे सरणी में आदिम प्रकार int है, long, या जो कुछ भी नहीं जानता है। मेरा मानना ​​है कि इसका निपटारा करने का एकमात्र तरीका प्राइमेटिव के प्रकार (जैसे Integer.TYPE या जो भी हो) पर चेक के आधार पर if/else "पेड़" है - इसके बाद उचित स्थिति और सशर्त शाखा में डाली गई है जो प्रश्न के प्रकार की पहचान करती है।

0

आप इस

int[] a = (int[])value; 
+0

क्षमा करें, मुझे अपने प्रश्न में एक महत्वपूर्ण बिंदु याद आया - मैंने सुधार किया है। – digiarnie

0

ओरेकल Tutorial में उल्लिखित यह array.getClass().getComponentType() के साथ आसानी से प्राप्त किया जा सकता है। यह सरणी में उदाहरणों की कक्षा देता है।

बाद में आप इसे प्रत्येक रैपर ऑब्जेक्ट के अंदर स्थित आदिम वर्ग के खिलाफ देख सकते हैं। उदाहरण के लिए:

if (array.getClass().getComponentType().equals(Boolean.TYPE)) { 
    boolean[] booleanArray = (boolean[]) array; 
} 
संबंधित मुद्दे