2010-03-09 11 views
57

Ich habe eine String, die den Namen einer Klasse hat sagen "Ex" (keine .class Erweiterung). Ich möchte es zu einer Class Variablen zugewiesen, wie folgt aus:Getting Class-Typ von String

Class cls = (string).class 

Wie kann ich das tun?

+0

Was ist, wenn die Klasse in anderen Projekt ist? – Steven

+0

Zu Ihrem Kommentar: Was! ??? Wenn Ihre Klasse in einem anderen Projekt war, dann hängt das nicht von Ihrer IDE ab? Soweit es Ihre Anwendung betrifft, wäre es so, als wäre es im selben Projekt, weil Bibliotheken extern referenziert werden. Wie Sie wissen, dass die Java-API-Klassen nicht in Ihrem Projekt sind, oder? Aber der Compiler für Ihre IDE weiß, wo Sie sie finden können, wenn Ihre IDE richtig eingerichtet ist. Gleiches gilt für Ihre Klassen aus einem anderen Projekt. – user919860

Antwort

130
Class<?> cls = Class.forName(className); 

Aber Ihre className sollte voll qualifiziert sein - das heißt com.mycompany.MyClass

+2

es wirft ClassNotFound Exception – Steven

+0

Dann ist entweder die Klasse nicht auf dem Klassenpfad oder Sie übergeben nicht den vollständig qualifizierten Klassennamen z. com.mycompany.project.ClassName –

+0

Welchen Wert von 'className' übergeben Sie? Gibt es eine solche Klasse auf Ihrem Klassenpfad? – Bozho

3

eeh .. Class.forName (String classname)?

+0

Können Sie dies auch für Unterklassen tun? – Gobliins

2

Nicht sicher, was Sie fragen, aber ... Class.forname, vielleicht?

+0

seine werfen ClassNotFound Exception – Steven

+0

Was ist, wenn die Klasse in einem anderen Projekt ist? – Steven

+0

Ich sehe, dass niemand Ihre Frage beantwortet. Es sollte egal sein, ob es in einem anderen Projekt ist, solange der Compiler weiß, wo er suchen soll. Da Sie wahrscheinlich eine IDE verwenden, hängt es wahrscheinlich nur von der IDE ab. Die Sache mit Referenzen, wissen Sie, dass alle Klassen, die Sie von den Java-Bibliotheken verweisen, nicht in Ihrem Projekt sind, oder? Aber der Compiler weiß, wo er nach ihnen suchen muss, weil er weiß, dass sie extern referenziert werden. Es scheint, dass Sie grundlegende Java-Programmierung erlernen müssen, wenn Sie versuchen, Java-Programmierung zu verbessern. : | – user919860

6

können Sie die forName Methode der Class verwenden:

   Class cls = Class.forName(clsName); 
       Object obj = cls.newInstance(); 
+0

Ich arbeite mit einem dynamischen Webprojekt in Eclipse. Ich verwende den obigen Code, um eine Klasse zu holen. aber es gibt ClassNotFoundException zurück, wenn ich eine String-Variable wie folgt verwende: 'String clsName =" com.mydoamin.className "; Klasse cls = Class.forName (clsName); ' Wenn Sie den Namen vollständig qualifizierten Klassen ist codieren als Parameter dann Dinge funktionieren. Irgendein Vorschlag? –

+0

@djthequest Wenn unsere 'clsName' -Variable den vollqualifizierten Klassennamen enthält, sollte es keinen Unterschied zwischen ihrer Verwendung und der fest codierten Zeichenkette geben. Möglicherweise haben Sie nicht die Klasse, die Sie im Klassenpfad benötigen. Es kann hilfreich sein, eine gemeinsame Klasse aus demselben jar in Ihrem Startcode zu instanziieren, um sicherzustellen, dass die Bibliothek im Klassenlader vorhanden ist. – rsp

+0

danke für deine Antwort, aber anstelle der Variablen, wenn ich die Zeichenfolge fest codiere, funktioniert Finnen, bedeutet dies, dass die Klassen im Klassenpfad sind, oder? Später fand ich heraus, 'Class.forName()' Methode erwartet eine 'final' Variable. Eine einfache Variable wird nicht funktionieren. –

32
String clsName = "Ex"; // use fully qualified name 
Class cls = Class.forName(clsName); 
Object clsInstance = (Object) cls.newInstance(); 

die Java Tutorial Weg für weitere Details bei http://java.sun.com/docs/books/tutorial/reflect/TOC.html auf Reflexion prüfen.

+3

Bozhos Antwort könnte mehr Punkte haben, aber ich denke, dass Ihre Beschreibung beschreibender ist. PS. Warum ist dein Name JuanZe ??? Fast klingt wie eine Mischung aus Spanisch und Chinesisch. : D. Gibt es eine kluge Bedeutung dahinter? – user919860

+0

@ user919860, Sie müssen es rückwärts lesen. – Pacerier

+0

Ich arbeite mit einem dynamischen Webprojekt in Eclipse. Ich verwende den obigen Code, um eine Klasse zu holen. aber es gibt ClassNotFoundException zurück, wenn ich eine String-Variable wie folgt verwende: 'String clsName =" com.mydoamin.className "; Klasse cls = Class.forName (clsName); ' Wenn Sie den Namen vollständig qualifizierten Klassen ist hart codieren als Parameter dann Dinge funktionieren. Irgendein Vorschlag? –

4

Sie können die Klassenreferenz jeder Klasse während der Laufzeit durch das Java-Reflektionskonzept erhalten.

Überprüfen Sie den unten stehenden Code. Explaianation ist unten angegeben Hier ist ein Beispiel, die Klasse zurück verwendet eine Instanz von AClass zu erstellen:

package com.xyzws;class AClass { 
     public AClass() { 
     System.out.println("AClass's Constructor"); 
    } 
    static { 
     System.out.println("static block in AClass"); 
    } 
    } 
    public class Program { 
    public static void main(String[] args) { 
     try {  
    System.out.println("The first time calls forName:"); 
     **Class c = Class.forName("com.xyzws.AClass");  
    AClass a = (AClass)c.newInstance();  
     System.out.println("The second time calls forName:"); 
     Class c1 = Class.forName("com.xyzws.AClass");** 
     } catch (ClassNotFoundException e) { 
       ... } catch (InstantiationException e) { 
       ... } catch (IllegalAccessException e) { 
       ... }  
     } 
    } 


    The output is 
    The first time calls forName: 
    static block in AClass 
    AClass's Constructor 
    The second time calls forName: 
     //Calss has been loaded so there is not "static block in AClass" printing outThe second 

Die Exaplaination unter

Class.forName ein Klassenobjekt zu erhalten genannt wird

Mit dem Klassenobjekt erstellen wir die neue Instanz der Klasse.

Irgendwelche Zweifel darüber lassen Sie mich wissen

+0

Was ist, wenn die Klasse in einem anderen Projekt ist? – Steven

+1

Können Sie eine JAR-Datei dieses Projekts erhalten und geben Sie den Klassennamen etwas wie Class.forName ("oracle.jdbc.driver.OracleDriver") – gmhk