2009-04-03 8 views
11

मैं कक्षाओं की एक सूची (Classname.class) के माध्यम से संग्रहीत कर रहा हूं और एक को तत्काल बनाना चाहता हूं? क्या यह संभव है?क्या मैं क्लास ऑब्जेक्ट का उपयोग कर कक्षा को इंस्टेंट्यूट कर सकता हूं? रचनाकारों के बारे में क्या?

newInstance विधि मैं के बाद कर रहा हूँ लगता है, लेकिन यह एक निर्माता का समर्थन नहीं करता?

उत्तर

0

आप इस तरह से नए वर्गों का निर्माण नहीं कर सकते हैं।

आप एक वर्ग का नाम है, तो आप Class.forName (className) का उपयोग कर सकते लोड/एक वर्ग को संदर्भित करने के।

यदि आपके पास उस वर्ग के लिए बाइट कोड है जिसे आप बनाना चाहते हैं तो आपके पास क्लास लोडर बाइट कोड लोड कर सकता है और आपको कक्षा दे सकता है। यह आपके इरादे से अधिक उन्नत होने की संभावना है।

+2

वह कक्षा के नए उदाहरण को तुरंत चालू करने के बारे में पूछ रहा है, क्लास ऑब्जेक्ट नहीं बना रहा है (न ही बाइट कोड कैसे प्राप्त करें)। इसे सही उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए। नीचे एंड्री के जवाब को पढ़ते रहें। –

+1

@RyanShillington यह मूल प्रश्न का उत्तर देता है। प्रश्न को एक अलग प्रश्न के रूप में संपादित किया गया था जिसे 'एंड्री' ने उत्तर दिया था। –

+0

आह, मैं देखता हूं। मेरी गलती। –

40

आप उपलब्ध रचनाकारों की एक सूची प्राप्त करने के लिए Class.getConstructors (या Class.getConstructor) का उपयोग कर सकते हैं, और उनमें से किसी को Constructor.newInstance के साथ आमंत्रित कर सकते हैं, जो पैरामीटर स्वीकार करता है।

5

जावा tutorial on reflection यह अच्छी तरह से शामिल किया गया। लेकिन हाँ, मूल रूप से Class.getConstructors, तो कंस्ट्रक्टर.न्यू इंस्टेंस वह जगह है जहां यह है।

1

आप Class वस्तुओं वर्ग शाब्दिक के माध्यम से प्राप्त की एक सूची है, तो आप के रूप में अच्छी स्थिर कंस्ट्रक्टर्स बल्कि प्रतिबिंब evilness में फिसल से संदर्भ हो सकता है।

+0

शायद एक सेवा कार्यक्रम में तत्कालता की जा रही है जिसे कई अन्य कार्यक्रमों के साथ जोड़ा जाएगा जो अभी तक नहीं बनाए गए हैं। वे सेवा कार्यक्रम को कॉल करेंगे, प्रत्येक एक अलग सूची के साथ कक्षा वर्गों के लिए कक्षा चर शामिल है जो सेवा कार्यक्रम लिखा गया था जब मौजूद नहीं था। – RenniePet

2

जावा डिज़ाइन किया गया है तो आप कर सकते हैं कभी नहीं "चाल" यह जब तक आप java.lang/जावा का उपयोग करें। कक्षाएं या अन्य मानक पुस्तकालयों। ओओपी की सबसे महत्वपूर्ण चीजों में से एक यह है कि वस्तुओं को परिभाषित राज्य में होना चाहिए, इस प्रकार आप सुरक्षित रह सकते हैं कि निर्माता हमेशा चल रहा है। भले ही आप अपना काम पूरा करने के लिए कुछ अजीब दिखने वाले प्रतिबिंब पुस्तकालयों का उपयोग कर रहे हों। ।

तो, Class.forName ("me.Test") का उपयोग newInstance(); (या समान) अंडर-द-हूड आपके लिए टेस्ट() कन्स्ट्रक्टर का आह्वान करेगा।

यदि आप किसी अन्य निर्माता आह्वान करने के लिए चाहते हैं, तो कोड की तरह कुछ है:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World"); 

यहाँ getConstructor क्या निर्माता लगता है कि (यह एक स्ट्रिंग चाहता है) और फिर आप इसे एक तार के साथ फोन पूछता है।

9

बस एक बिंदु जोड़ने के लिए मुझे याद आ देखें:

आप Class वस्तु पर सीधे newInstance आह्वान कर सकते हैं अगर यह एक सार्वजनिक नल निर्माता है। (नल कन्स्ट्रक्टर कोई तर्क नहीं वाला कन्स्ट्रक्टर है।)

अन्यथा, आप Class.getConstructors() के माध्यम से कन्स्ट्रक्टर पा सकते हैं जैसा कि अन्य ने कहा है।

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

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