Abrufen des Klassentyps aus dem String

83

Ich habe eine, Stringdie den Namen einer Klasse hat, sagen wir "Ex"(keine .classErweiterung). Ich möchte es einer ClassVariablen wie folgt zuweisen :

Class cls = (string).class

Wie kann ich das machen?

Steven
quelle
Was ist, wenn sich die Klasse in einem anderen Projekt befindet?
Steven
Zu deinem Kommentar: Was! ??? Wenn Ihre Klasse in einem anderen Projekt wäre, würde es dann nicht von Ihrer IDE abhängen? Für Ihre Anwendung wäre es sowieso so, als wäre sie im selben Projekt, da auf die Bibliotheken extern verwiesen wird. Sie wissen also, dass die Java-API-Klassen nicht in Ihrem Projekt enthalten sind, oder? Der Compiler für Ihre IDE weiß jedoch, wo sie zu finden sind, wenn Ihre IDE korrekt eingerichtet ist. Gleiches gilt für Ihre Klassen aus einem anderen Projekt.
user919860

Antworten:

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

Aber Sie classNamesollten voll qualifiziert sein - dhcom.mycompany.MyClass

Bozho
quelle
2
seine werfen ClassNotFound Exception
Steven
1
dann befindet sich entweder die Klasse nicht im Klassenpfad oder Sie übergeben den vollständig qualifizierten Klassennamen nicht, z. B. com.mycompany.project.ClassName
Hans Westerbeek
Welchen Wert geben classNameSie weiter? Gibt es eine solche Klasse auf Ihrem Klassenpfad?
Bozho
Ja, die Klasse ist im selben Paket
Steven
1
Ich habe das gleiche Problem mit ClassNotFoundException. Der Trick bestand darin, die Ausnahme in einem Try-Catch zu behandeln. So etwas wie das:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
Kumaheiyama
43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

Weitere Informationen finden Sie im Java Tutorial-Pfad zu Reflection unter http://java.sun.com/docs/books/tutorial/reflect/TOC.html .

JuanZe
quelle
3
Bozhos Antwort mag mehr Punkte haben, aber ich denke, dass Ihre aussagekräftiger ist. PS. Warum heißt du JuanZe ??? Klingt fast wie eine Mischung aus Spanisch und Chinesisch. : D. Gibt es eine kluge Bedeutung dahinter?
user919860
Ich arbeite mit einem dynamischen Webprojekt in Eclipse. Ich verwende den obigen Code, um eine Klasse abzurufen. Wenn ich eine Zeichenfolgenvariable wie die folgende verwende, wird jedoch ClassNotFoundException zurückgegeben: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Wenn der vollständig qualifizierte Klassenname als Parameter fest codiert ist, funktionieren die Dinge einwandfrei . Irgendein Vorschlag?
Dibyanshu Jaiswal
8

Sie können die forNameMethode verwenden von Class:

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
rsp
quelle
Ich arbeite mit einem dynamischen Webprojekt in Eclipse. Ich verwende den obigen Code, um eine Klasse abzurufen. Wenn ich eine Zeichenfolgenvariable wie die folgende verwende, wird jedoch ClassNotFoundException zurückgegeben: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Wenn der vollständig qualifizierte Klassenname als Parameter fest codiert ist, funktionieren die Dinge einwandfrei . Irgendein Vorschlag?
Dibyanshu Jaiswal
@djthequest Wenn unsere clsNameVariable den vollständig qualifizierten Klassennamen enthält, sollte es keinen Unterschied zwischen der Verwendung und der fest codierten Zeichenfolge geben. Möglicherweise haben Sie nicht die Klasse, die Sie benötigen, im Klassenpfad. Es kann hilfreich sein, eine gemeinsame Klasse aus demselben JAR in Ihrem Startcode zu instanziieren, um sicherzustellen, dass die Bibliothek im Klassenladeprogramm vorhanden ist.
rsp
Vielen Dank für Ihre Antwort, aber anstelle der Variablen, wenn ich den String fest codiere, funktioniert Flossen, bedeutet dies, dass sich die Klassen im Klassenpfad befinden, oder? Später fand ich heraus, dass die Class.forName()Methode eine finalVariable erwartet . Eine einfache Variable funktioniert nicht.
Dibyanshu Jaiswal
4

Sie können die Klassenreferenz jeder Klasse zur Laufzeit über das Java Reflection Concept abrufen.

Überprüfen Sie den folgenden Code. Die Erklärung ist unten angegeben

Hier ist ein Beispiel, das die zurückgegebene Klasse verwendet, um 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) { 
            // ...
        }     
    }
}

Die gedruckte Ausgabe ist

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

Die Klasse wurde bereits geladen, daher gibt es keinen zweiten "statischen Block in AClass".

Die Erklärung ist unten

Class.ForName wird aufgerufen, um ein Klassenobjekt abzurufen

Mit dem Klassenobjekt erstellen wir die neue Instanz der Klasse.

Alle Zweifel daran lassen Sie es mich wissen

gmhk
quelle
Was ist, wenn die Klasse in einem anderen Projekt ist?
Steven
1
Können Sie eine JAR-Datei dieses Projekts erhalten und den Klassennamen wie Class.forName ("oracle.jdbc.driver.OracleDriver")
angeben
3

Es sollte sein:

Class.forName(String classname)

Hans Westerbeek
quelle
Können Sie dies auch für Unterklassen tun?
Gobliins
2

Sie sind sich nicht sicher, was Sie fragen, aber ... Class.forname vielleicht?

Manrico Corazzi
quelle
seine werfen ClassNotFound Exception
Steven
Was ist, wenn die Klasse in einem anderen Projekt ist?
Steven
1
Ich sehe, dass niemand Ihre Frage beantwortet. Es sollte keine Rolle spielen, ob es sich um ein anderes Projekt handelt, solange der Compiler weiß, wo er suchen muss. Da Sie wahrscheinlich eine IDE verwenden, hängt dies wahrscheinlich ausschließlich von der IDE ab. Was Referenzen betrifft, wissen Sie, dass alle Klassen, auf die Sie aus den Java-Bibliotheken verweisen, nicht in Ihrem Projekt enthalten sind, oder? Der Compiler weiß jedoch, wo er nach ihnen suchen muss, da er weiß, dass auf sie extern verwiesen wird. Es scheint, dass Sie grundlegende Java-Programmierung lernen müssen, wenn Sie versuchen, die Java-Programmierung zu erweitern. : |
user919860