2010-01-11 5 views
14

मुझे इस तरह के प्रश्न पूछने के लिए खेद है, लेकिन मुझे वास्तव में Google में जवाब नहीं मिला। तो कहें कि मेरे पास private String myColor के साथ एक कक्षा है और मेरे पास "mycolor" स्ट्रिंग है। अब मैं myColor विशेषता में हेरफेर करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?जावा में, स्ट्रिंग को इसके नाम से दिए गए गुण कैसे प्राप्त करें?

संपादित करें: एक अस्पष्ट प्रश्न के लिए क्षमा करें, मुझे लगता है कि सबसे अच्छा तरीका समझाने के लिए कि मैं क्या के लिए इसकी आवश्यकता है। मेरे पास स्विंग फॉर्म है और गुई लोड करते समय फ़ील्ड के मान सेट करने के लिए प्राथमिकताओं एपीआई का उपयोग करना चाहते हैं। तो मैं सभी क्षेत्रों को पढ़ सकता हूं और फिर उनमें से प्रत्येक के लिए outputDirectoryTextField.setText(valueFromPrefsAPI); कर सकता हूं, लेकिन ऐसा लगता है कि यह अनियंत्रित कोडिंग का थोड़ा सा है, इसलिए मैं फ़ील्ड के नाम और उनके माध्यम से लूप के साथ एक सरणी (हैश?) रखना चाहता हूं, जैसे:

String[] myTextInputs = {"thisInput", "thatInput"}; 

for (String inputName : myTextInputs) { 
    String value = prefs.get(inputName, ""); 
    /* some code I'm seeking to find out*/.setText(value); 
} 
+1

मेरे प्रोफाइल पेज से लिंक देखें, यह इस उद्देश्य के लिए बनाया गया है। मेरी उपयोगिता का उपयोग करने के लिए आपको बस 'बीनप्रॉपर्टी कंट्रोलर बीपीसी = बीनप्रॉपर्टी कंट्रोलर.ओफ (YourClass.class, ExtractionDepth.FIELDS) करने की आवश्यकता है; bpc.mutate ("mycolor", itsNewValue); हालांकि ध्यान दें कि 'निष्कर्षण डेपथ।FIELDS का मानना ​​है कि कम से कम एक मिलर एक मिलान नाम के साथ मैदान के लिए मौजूद है। – Esko

उत्तर

36

आप किसी भी वस्तु की सामग्री का निरीक्षण करने के रूप में इस प्रतिबिंब का उपयोग कर सकते हैं:

Object o = ...; // The object you want to inspect 
Class<?> c = o.getClass(); 

Field f = c.getDeclaredField("myColor"); 
f.setAccessible(true); 

String valueOfMyColor = (String) f.get(o); 

ध्यान दें कि getDeclaredField() केवल ऑब्जेक्ट की कक्षा द्वारा घोषित फ़ील्ड को वापस कर देगा। यदि आप किसी ऐसे क्षेत्र की तलाश में हैं जो सुपरक्लास द्वारा घोषित किया गया था, तो आपको ऑब्जेक्ट के सभी वर्गों पर लूप करना चाहिए (बार-बार c = c.getSuperclass() तक c == null तक)

यदि आप बदलना चाहते हैं

f.set(o, "some-new-value-for-field-f-in-o") 

अतिरिक्त विवरण:: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Field.html


https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getField(java.lang.String)

आप फ़ील्ड का मान आप सेट विधि का उपयोग कर सकते हैं GetField (...) का उपयोग कर सकते हैं जो कक्षा में नहीं मिलने पर सुपर क्लास पर खोज करेगा।

+1

आपको अंतिम पंक्ति में 'स्ट्रिंग' पर स्पष्ट रूप से डालना होगा, क्योंकि 'फ़ील्ड' एस सामान्य नहीं हैं और इसलिए (ऑब्जेक्ट 'प्रकार का परिणाम वापस प्राप्त करें। आपको विभिन्न प्रकार के सुरक्षा अपवाद को भी पकड़ने की आवश्यकता होगी और जागरूक रहें कि पर्यावरण के आधार पर यह कोड शायद ही कभी चलाने में सक्षम न हो। यह * ओपी * के लिए क्या पूछा गया है, लेकिन यह केवल उन चीजों को जानने के लिए जिम्मेदार है और उन्हें अधिक उपयुक्त विकल्पों की ओर ले जाने के लिए जिम्मेदार है। –

1

आपको निजी सदस्य चर को संशोधित करने के लिए 'म्यूटेटर' बनाना होगा।

class example{ 
    private string myColor; 
    public void changeColor(string newColor){ 
     myColor = newColor; 
    } 
} 
+0

सेटर्स और गेटर्स ऐसा करने के लिए एक और अधिक आम तरीका होगा; मिक्सेल का कोड उदाहरण देखें। –

+1

म्यूटेटर एक सेटर के लिए एक और नाम है। http://en.wikipedia.org/wiki/Mutator_method > म्यूटेटर विधि, जिसे कभी-कभी "सेटर" कहा जाता है ... – zmbush

3

अगर मैं आपके सवाल का सही ढंग से समझ ... आप सार्वजनिक getters और setters बनाना चाहिए:

public void setMyColor(String color) { 
    this.myColor = color; 
} 

public String getMyColor { 
    return this.myColor; 
} 
3

संपादन के आधार पर, मेरा सुझाव एक मानचित्र का उपयोग उचित टेक्स्ट फ़ील्ड या अन्य टेक्स्ट घटक में वरीयता नाम का नक्शा रखने के लिए करना है। जब आप उपयोगकर्ता इंटरफ़ेस बनाते हैं तो बस मानचित्र बनाएं।

Map<String, JTextField> guiFields = new HashMap<String, JTextField>(); 

तो फिर तुम कोड कर

guiFields.get(inputName).setText(value); 
+0

डाउनवोट क्यों? बुरा विचार? –

2

जहां ऐसा करना चाहते हो सकता है यह निर्भर करता है। वर्ग आप बस इसके साथ जो कुछ भी, उदा के अंदर:

myColor = "blah blah"; 

बाहर से, आप कुछ सार्वजनिक विधि अन्य पदों संकेत दिया आम तौर पर के रूप में की आवश्यकता है। सभी मामलों में, आपको सावधान रहना होगा यदि आपका पर्यावरण बहु-थ्रेडेड में है। कक्षा स्तर चर धागे सुरक्षित नहीं हैं।

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