2011-01-14 17 views
5

के रूप में घोषित करने के बारे में बता रहा था कि मैं सोच रहा था कि जावा में किसी दिए गए प्रकार की एक नई वस्तु घोषित करना संभव है, क्योंकि मेरे पास क्लास ऑब्जेक्ट के रूप में प्रतिनिधित्व किया गया है।जावा ऑब्जेक्ट को अपने टाइप/क्लास नाम को स्ट्रिंग

उदाहरण के लिए, हम कहते हैं कि मैं

SomeClass obj1; 
Class c = obj1.getClass(); 

अब मैं "सी" लेगी और उसका उपयोग उस प्रकार की एक नई वस्तु घोषित करने के लिए करना चाहते हैं कि चलो। इन पंक्तियों के साथ कुछ:

Class<c> my_new_var; 

ऐसी है कि my_new_var तो obj1 के रूप में एक ही प्रकार/वर्ग की एक चर होगा। यह अनुमान है कि, हम एक नए चर की घोषणा में टाइप के रूप में क्लास ऑब्जेक्ट (या उस क्लास ऑब्जेक्ट से संबंधित कुछ) का उपयोग कर सकते हैं या नहीं।

क्या यह संभव है, या असंभव है क्योंकि जावा दृढ़ता से टाइप किया गया है?

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

ब्रूनो

+0

इस तरह के गतिशील प्रवंचना भी है गतिशील भाषाओं में हतोत्साहित करता है। आपको क्यों लगता है कि यह एक अच्छा विचार है? – delnan

उत्तर

2
YourType newObject = c.newInstance(); 

लेकिन अगर आप एक नहीं आर्ग निर्माता की आवश्यकता है। अन्यथा आपको अधिक प्रतिबिंब करना होगा।

ध्यान दें कि आपकी Class पैरामीटरकृत होने पर डालने की कोई आवश्यकता नहीं है। यदि ऐसा नहीं है, तो आपके कोड में, आपको एक कलाकार की आवश्यकता होगी।

अपने दूसरे प्रश्न के लिए - नहीं, गतिशील प्रकार के चर को घोषित करना संभव नहीं है, क्योंकि हाँ, जावा स्थिर रूप से टाइप किया गया है। आपको संकलन समय पर एक चर के प्रकार को परिभाषित करना होगा। ऊपर के उदाहरण में आप कर सकते हैं:

  • उपयोग Object, यदि आप प्रकार पता नहीं है, क्योंकि यह सभी वस्तुओं की सुपर क्लास है।
  • जेनिक्स का उपयोग करें।

    public static <T> T createNewInstance(T exampleInstance) { 
        return (T) exampleInstance.getClass().newInstance(); 
    } 
    
+2

बशर्ते कि आपकी कक्षा में सार्वजनिक नो-पैरामीटर कन्स्ट्रक्टर है। – biziclop

+0

धन्यवाद Bozho। मैं समझता हूं कि c.newInstance() मुझे obj1 के समान प्रकार का एक नया ऑब्जेक्ट देगा; समस्या यह है कि जब नया ऑब्जेक्ट घोषित किया जाता है, तो मुझे अभी भी इसे "योर टाइप" के रूप में घोषित करने की आवश्यकता होगी, जिसे मैं मानता हूं कि मुझे "सी" के अलावा छोड़कर नहीं पता है। आदर्श रूप में मुझे लगता है कि क्लास जैसे किसी नए चर की घोषणा करते समय एक प्रकार के रूप में उपयोग किया जा सकता है - जैसे कि मैं कक्षा newObject = c.newInstance() कर सकता हूं, लेकिन मुझे लगता है कि यह असंभव हो सकता है क्योंकि जावा स्थिर रूप से है आपके द्वारा लिखा गया। क्या मैं सही हू? एक बार फिर से धन्यवाद! – Bruno

+0

'टी' (या 'ऑब्जेक्ट') के साथ मेरे दूसरे उदाहरण के रूप में आप वास्तविक प्रकार की घोषणा स्थगित कर सकते हैं। लेकिन किसी बिंदु पर आपको सटीक प्रकार जानने की आवश्यकता होगी। यदि आपको इसकी आवश्यकता नहीं है (उस पर विधियों को कॉल करने के लिए), तो आप इसे आसानी से 'ऑब्जेक्ट' – Bozho

0

यीप, कोशिश: उदाहरण (अपवाद हैंडलिंग के साथ छोड़े गए) के लिए

यह एक = c.newInstance();

0
इस तरह

:

Class c = Class.forName("com.xyzws.SomeClass"); 
Object a = c.newInstance(); 
1

आप एक डिफ़ॉल्ट निर्माता है:

SomeClass obj2 = (SomeClass) c.newInstance(); 
+0

धन्यवाद एडबुल्ला के रूप में देख सकते हैं। मैं आपके समाधान को समझता हूं, लेकिन ध्यान दें कि आपके आदेश में, कुछ क्लास, सी द्वारा प्रतिनिधित्व प्रकार/वर्ग है, जो इस मामले में मुझे लगता है कि मुझे नहीं पता (सी के माध्यम से छोड़कर)। आदर्श रूप में मैं जो खोजना चाहता हूं वह यह है कि कक्षा जैसे किसी नए चर की घोषणा करते समय एक प्रकार के रूप में उपयोग किया जा सकता है - जैसे कि मैं कक्षा newObject = c.newInstance() जैसी कुछ कर सकता हूं, लेकिन मैं समझता हूं कि यह हो सकता है जावा असंभव टाइप होने के बाद असंभव हो। क्या मैं सही हू? एक बार फिर से धन्यवाद! – Bruno

+0

किसी ऑब्जेक्ट उन्मुख भाषा में आपको इसके साथ कुछ भी करने से पहले कुछ प्रकार के बारे में जानना होगा। जावा में यह एक इंटरफ़ेस या बेस क्लास हो सकता है, और आप किसी एक को भी डाल सकते हैं। कुछ और जानने के बिना यह केवल एक वस्तु है और आप इसके साथ बहुत कम कर सकते हैं। –

0

my_new_var प्रकार Class<SomeClass>, जो obj1 प्रकार SomeClass की है जो के समान नहीं है की होगी।

हालांकि my_new_var.newInstance() आपको एक नई वस्तु देता है जो obj1 जैसा ही है।

0

ठीक है, आप ऐसा कर सकता है:

SomeClass obj1 = ... 
Class<? extends SomeClass> c = obj1.getClass(); 
SomeClass obj2 = c.newInstance(); 

यह की SomeClassobj1 वास्तव में है जो कुछ उपवर्ग पर नो-आर्ग निर्माता (यदि हो तो) की आवश्यकता है।

हालांकि, यह केवल इसलिए काम करता है क्योंकि आप प्रश्न में Class ऑब्जेक्ट के प्रकार को जानते हैं। कुछ मनमानी कच्चे Class या Class<?> ऑब्जेक्ट को देखते हुए, आपको नहीं पता कि किस प्रकार की ऑब्जेक्ट newInstance() वापस आ जाएगी और आप केवल उस उदाहरण को Object के रूप में घोषित करने में सक्षम होंगे।

0
मुझे इस के लिए

काम किया:

Object innerObj = classObj.getClass().newInstance(); 
संबंधित मुद्दे