2009-09-17 15 views
26

मुझे कक्षा का नाम पता है, "MyClass" और Class ऑब्जेक्ट को पुनर्प्राप्त करना चाहते हैं, यानी। भविष्य के संदर्भों के लिए MyClass.class। क्या ऐसा करने के लिए कोई रास्ता है?जावा में कक्षा नाम से क्लास ऑब्जेक्ट कैसे प्राप्त करें

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

संपादित करें: इस के लिए सबसे पहले जवाब के बारे में:

मैं पहले से ही forName() विधि देख लिया है, लेकिन मैंने सोचा कि यह भी वर्ग को प्रारंभ माना जाता है। अब मैं इसे पूर्ण तर्क के साथ बुला सकता हूं और दूसरे तर्क में false पास कर सकता हूं, लेकिन तीसरा होना चाहिए null या क्या?

चाहेंगे

Class.forName("MyClass", false, null); 

वापसी MyClass.class?

वास्तव में, मुझे क्या करना चाहते हैं, जिसमें से वर्ग ऑब्जेक्ट स्वचालित रूप से दिलवाया रहे हैं, कुछ शारीरिक श्रम से छुटकारा पाने के लिए आईडी की एक सरणी :)

साथ स्ट्रिंग Class वस्तुओं के साथ जुड़े आईडी, की एक सरणी की जगह है

त्वरित उत्तर के लिए धन्यवाद और इससे पहले कि इसका उल्लेख न करें।

उत्तर

45

आप उपयोग कर सकते हैं:

Class c = Class.forName("com.package.MyClass"); 

और बाद में एक वस्तु का दृष्टांत:

Object obj = c.newInstance(); 

संपादित करें: यह सिर्फ आसान उपयोग है। जैसा कि टिप्पणियों में दर्शाया गया है, आपको प्रारंभिक प्रक्रिया द्वारा फेंकने वाले कन्स्ट्रक्टर तर्क और अपवादों पर विचार करना होगा। JavaDocs for newInstance में सभी विवरण हैं।

+0

कक्षा। नया इंस्टॉलेशन अपवादों के साथ बुरी चीजें करता है। –

+1

हां। आपको किसी भी प्रारंभिक अपवादों को संभालने की आवश्यकता होगी। –

+2

इसके लिए काम करने के लिए, कक्षा में एक सुलभ नो-Args कन्स्ट्रक्टर होना चाहिए। – Jesper

7
Class.forName("MyClass") 

पढ़ें the JavaDoc विवरण

+0

यदि आप कक्षा शुरू करना नहीं चाहते हैं, तो आपको तीन-तर्क फ़ॉर्म की आवश्यकता है। –

3

के लिए ऐसा लगता है कि आप Class class के स्थिर forName method उपयोग करने में सक्षम हो सकता है।

2

यह भी ध्यान देने योग्य है कि उपर्युक्त सुझाव सही हैं, लेकिन केवल डिफ़ॉल्ट (पैरामीटर रहित) रचनाकारों के लिए काम करेंगे। आप कुछ भी ऐसा कर सकते हैं:

public Object newInstance(String className, Object...args) throws Exception { 
     Class<?> clazz = Class.forName(className); 
     if(args == null || args.length == 0) { 
      return clazz.newInstance(); 
     } 

     List<Class<?>> argTypes = new ArrayList<Class<?>>(); 
     for(Object object : args) { 
      argTypes.add(object.getClass()); 
     } 
     Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()])); 
     return explicitConstructor.newInstance(args); 
    } 
+0

यह कोई काम नहीं करेगा यदि तर्क में से कोई एक सबक्लस या कन्स्ट्रक्टर चाहता है जो कार्यान्वयन चाहता है। – ColinD

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