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?


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


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 .


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();

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


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


2

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.