2009-12-12 11 views
15

हाँ, मुझे पता है। प्रश्न का लंबा शीर्षक ... तो मेरे पास स्ट्रिंग में कक्षा का नाम है। मैं गतिशील इस तरह से उस वर्ग की वस्तु बना रहा हूं:क्लास नाम ज्ञात होने पर ऑब्जेक्ट क्लास के जावा ऑब्जेक्ट को गतिशील रूप से परिवर्तित करना

String className = "com.package.MyClass"; 
Class c = Class.forName(className); 
Object obj = c.newInstance(); 

मैं गतिशील कैसे परिवर्तित कर सकते हैं कि objको MyClass वस्तु?

MyClass mobj = (MyClass)obj; 

... क्योंकि className अलग हो सकता है: मैं इस तरह से नहीं लिख सकते हैं।

+0

कि कोड परिवर्तित नहीं करता है: यह typecasts। क्या यही मतलब है तुम्हारा? – EJP

उत्तर

17

आप नहीं, एक अंतरफलक है कि तरीकों की घोषणा की घोषणा आप चाहते हैं करते हैं कॉल करने के लिए:

public interface MyInterface 
{ 
    void doStuff(); 
} 

public class MyClass implements MyInterface 
{ 
    public void doStuff() 
    { 
    System.Console.Writeln("done!"); 
    } 
} 

तो आप का उपयोग आपके नियंत्रण में

MyInterface mobj = (myInterface)obj; 
mobj.doStuff(); 

MyClass यदि नहीं है तो आप कर सकते हैं ' इसे कुछ इंटरफ़ेस लागू नहीं करते हैं, और दूसरा विकल्प प्रतिबिंब (see this tutorial) पर भरोसा करना है।

+0

हालांकि मैं ज्यादातर मामलों में ग्रेग से सहमत हूं; मैंने खुद को ऐसी परिस्थिति में पाया जहां मैं इंटरफेस के बारे में जानना नहीं चाहता हूं। मुझे नहीं पता कि उपरोक्त उस ट्यूटोरियल ने इस मुद्दे को संबोधित किया है, लेकिन इस मुद्दे पर मेरे शोध में जो कुछ भी मैंने पाया वह नहीं था। यहां एक गतिशील समाधान है जिसके साथ आया था (आपको विधि/फ़ील्ड के नाम के साथ-साथ कक्षा का नाम जानना होगा): http://forums.sun.com/thread.jspa?threadID=5419973 – LostNomad311

+0

हालांकि सवाल काफी पुराना है, लेकिन मेरी राय में दी गई कार्यक्षमता को लागू करने के लिए एक बेहतर तरीका है (कार्यों को आमंत्रित करना)। 'URLClassLoader classLoader = URLClassLoader.newInstance (नया URL [] {parentDirectory.toURI()। ToURL()}); कक्षा myClass = classLoader.loadClass (className); विधि doStuff = myClass.getDeclaredMethod ("doStuff"); doStuff.invoke (helloClass.newInstance()); ' – CoderX

2

यदि आपको पता नहीं था कि mojbMyClass प्रकार है, तो आप उस चर को कैसे बना सकते हैं?

यदि MyClass एक इंटरफ़ेस प्रकार है, या एक सुपर प्रकार है, तो कलाकारों को करने की कोई आवश्यकता नहीं है।

3

आपको ऑब्जेक्ट को MyClass ऑब्जेक्ट में कनवर्ट करने की आवश्यकता नहीं है क्योंकि यह पहले से ही है। Wnat आप वास्तव में करना चाहते हैं इसे कास्ट करना है, लेकिन चूंकि वर्ग का नाम संकलन समय पर ज्ञात नहीं है, इसलिए आप ऐसा नहीं कर सकते हैं, क्योंकि आप उस वर्ग के चर को घोषित नहीं कर सकते हैं। मेरा अनुमान है कि आप "बतख टाइपिंग" जैसी कुछ चाहिए/चाहते हैं, यानी आप कक्षा का नाम नहीं जानते हैं लेकिन आप संकलन समय पर विधि का नाम जानते हैं। ग्रेगरी द्वारा प्रस्तावित इंटरफेस, ऐसा करने के लिए आपकी सबसे अच्छी शर्त है।

+0

यदि आपको वास्तव में इस तरह की सुविधा की आवश्यकता है, तो दूसरी भाषा पर विचार करें - ग्रोवी वह है जो जेवीएम पर चलता है लेकिन इसमें वह सुविधा है जो आप चाहते हैं। – Chii

44

मैं प्रतिबिंब

MyClass mobj = MyClass.class.cast(obj); 

साथ अपनी सुंदर सीधे आगे लगता है और अगर वर्ग के नाम अलग है

Object newObj = Class.forName(classname).cast(obj); 
+0

यह सरल और सीधा है। धन्यवाद लुकास। –

+1

यह अब तक का सबसे अच्छा समाधान है, मैं इस दृष्टिकोण की तरह खोज रहा हूं और अंततः इसे – Yahya

+0

पाया गया यह आसान है और अच्छी तरह से काम किया है। –

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