Ich habe eine, String
die den Namen einer Klasse hat, sagen wir "Ex"
(keine .class
Erweiterung). Ich möchte es einer Class
Variablen wie folgt zuweisen :
Class cls = (string).class
Wie kann ich das machen?
Ich habe eine, String
die den Namen einer Klasse hat, sagen wir "Ex"
(keine .class
Erweiterung). Ich möchte es einer Class
Variablen wie folgt zuweisen :
Class cls = (string).class
Wie kann ich das machen?
Antworten:
Class<?> cls = Class.forName(className);
Aber Sie className
sollten voll qualifiziert sein - dhcom.mycompany.MyClass
className
Sie weiter? Gibt es eine solche Klasse auf Ihrem Klassenpfad?
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 */ }
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 .
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?
Sie können die forName
Methode verwenden von Class
:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
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?
clsName
Variable 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.
Class.forName()
Methode eine final
Variable erwartet . Eine einfache Variable funktioniert nicht.
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
Es sollte sein:
Class.forName(String classname)
Sie sind sich nicht sicher, was Sie fragen, aber ... Class.forname vielleicht?