2011-09-22 26 views
8

मैं सोच रहा था कि क्या यह जावा में निम्नलिखित की तरह कुछ है संभव हो जाएगा के साथ वस्तु क्षेत्र प्रदान करना उपयोगी।जावा विधि प्रतिबिंब

धन्यवाद!

संपादित करें: इस का कारण यह है कि मैं निम्नलिखित

public static MyClass setAll(List<String> fieldNames, List<Object> fieldValues) { 
    MyClass anObject = new MyClass(); 
    // iterate fieldNames and fieldValues and set for each fieldName 
    // the corresponding field value 
    return anObject; 
} 

उत्तर

7

ज़रूर की तरह एक और कक्षा में एक विधि है चाहते हैं:

aField.set(this, aValue); 

पहले जाँच प्रकार करने के लिए:

if (!aField.getType().isInstance(aValue)) 
    throw new IllegalArgumentException(); 

लेकिन गलत टाइप के मूल्य के साथ set पर कॉल करने सेउत्पन्न होगा वैसे भी, उस तरह की जांच बहुत उपयोगी नहीं है।

+1

हाँ मैंने कोशिश की लेकिन बात यह है कि मैं विधि में किसी प्रकार की जांच और उपयुक्त कास्टिंग जोड़ना चाहता हूं। कोई विचार? – gpol

+0

यदि आप चाहें तो टाइपिंग जांच कर सकते हैं (लेकिन अगर आप असफल चेक के साथ करते हैं तो फेंकना है, तो यह व्यर्थ है, क्योंकि प्रतिबिंब तंत्र आपके लिए फेंक देगा)। कोई कास्टिंग उपयुक्त नहीं होगा। –

4

हालांकि मैं तुम क्यों इस तरह यह करने के लिए (के बाद से आप पहले से ही getters और setters है) चाहते हो जाएगा के रूप में एक नुकसान में हूँ, इस प्रयास करें:

Field aField = getClass().getDeclaredField(aFieldName); 
aField.set(this, aValue); 

अधिक जानकारी के लिए, see this

+0

मेरा मूर्खतापूर्ण। मैंने यह बताने के लिए अपना प्रश्न संपादित किया कि मैं इसे क्यों चाहता हूं। – gpol

+0

ठीक है, तो क्या उत्तर पर्याप्त है? यदि आप चाहते हैं, तो आपके पास 'सेट' के अधिक विशेष संस्करण भी हैं, जैसे 'सेटलांग', 'सेटफ्लैट', 'सेटबोलियन' इत्यादि। जावाडॉक संदर्भित देखें। –

3

मैं List<T> के बजाय map का सुझाव देना चाहता हूं।

for(Map.Entry<String,Object> entry:map.entrySet()) 
    { 
    Field aField = anObject.getClass().getDeclaredField(entry.getKey()); 
    if(entry.getValue().getClass().equals(aField.getType())) 
     aField.set(anObject,entry.getValue()); 
    } 
return anObject; 
संबंधित मुद्दे