2009-12-12 5 views
15

Ja, ich weiß. Langer Titel der Frage ... Also habe ich den Klassennamen in der Zeichenfolge. Ich Objekt dieser Klasse auf diese Weise dynamisch erstellen:Dynamisches Konvertieren des Java-Objekts der Object-Klasse in eine bestimmte Klasse, wenn der Klassenname bekannt ist

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

Wie ich dynamisch, dass obj zu MyClass Objekt konvertieren kann? Ich kann nicht auf diese Weise schreiben:

MyClass mobj = (MyClass)obj; 

... weil classname kann unterschiedlich sein.

+0

Dieser Code konvertiert nicht: es Umwandlungen. Meinst Du das? – EJP

Antwort

17

Sie nicht erklären, eine Schnittstelle, die die Methoden erklärt, Sie möchten rufen:

public interface MyInterface 
{ 
    void doStuff(); 
} 

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

dann verwenden Sie

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

Wenn MyClass nicht unter Kontrolle, dann können Sie‘ t es machen einige Schnittstelle zu implementieren, und die andere Option ist auf Reflexion (see this tutorial) beruhen.

+0

Obwohl ich Greg in den meisten Fällen stimme; Ich befand mich in einer Situation, in der ich nicht über Schnittstellen Bescheid wissen möchte. Ich weiß nicht, ob das obige Tutorial dieses Problem anspricht, aber keines, das ich bei meinen Nachforschungen zu dem Problem gefunden hätte. Hier ist eine dynamische Lösung, die ich entwickelt habe (Sie müssen den Namen der Methode/Feld sowie den Namen der Klasse kennen): http://forums.sun.com/thread.jspa?threadID=5419973 – LostNomad311

+0

Obwohl Die Frage ist ziemlich alt, aber meiner Meinung nach gibt es einen viel besseren Weg, die gegebene Funktionalität zu implementieren (Aufruf der Funktionen). 'URLClassLoader classLoader = URLClassLoader.newInstance (neue URL [] {parentDirectory.toURI(). ToURL()}); Klasse myClass = classLoader.loadClass (Klassenname); Methode doStuff = myClass.getDeclaredMethod ("doStuff"); doStuff.invoke (helloClass.newInstance()); ' – CoderX

2

Wenn Sie nicht wussten, dass mojb vom Typ MyClass ist, wie können Sie dann diese Variable erstellen?

Wenn MyClass ein Schnittstellentyp oder ein Super-Typ ist, ist kein Cast erforderlich.

3

Sie müssen das Objekt nicht in ein MyClass-Objekt konvertieren, da es bereits vorhanden ist. Sie möchten es wirklich umsetzen, aber da der Klassenname zur Kompilierzeit nicht bekannt ist, können Sie das nicht tun, da Sie eine Variable dieser Klasse nicht deklarieren können. Meine Vermutung ist, dass Sie etwas wie "Ente tippen" wollen/brauchen, d.h. Sie kennen den Klassennamen nicht, aber Sie kennen den Methodennamen zur Kompilierzeit. Schnittstellen, wie von Gregory vorgeschlagen, sind die beste Wahl dafür.

+0

Wenn Sie diese Art von Funktion wirklich brauchen, denken Sie über eine andere Sprache nach - groovy ist eine, die auf dem jvm läuft, aber die gewünschte Funktion hat. – Chii

44

Ich denke, seine ziemlich geradlinig mit Reflexion

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

und wenn Klassennamen unterscheidet

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

Das ist einfach und unkompliziert. Danke Lukas. –

+1

Dies ist die beste Lösung, die ich je gesucht habe, und fand sie schließlich – Yahya

+0

Es ist einfach und funktionierte gut. –

Verwandte Themen