Prüfen ob die Klasse existiert, ohne läuft in ClassNotFoundException
Um das planen der Ausführung eines Auftrags, bekomme ich den Namen der Klasse als string-Eingabe.
Diese Klasse kann in einem der zwei Pakete, aber ich weiß nicht, was man, so habe ich dies zu überprüfen.
Inzwischen habe ich zwei try-catch-Blöcke
Class<Job> clazz;
String className; //the above mentioned string, will be initialized
try {
clazz = (Class<Job>) Class.forName("package.one." + className);
} catch (ClassNotFoundException ex) {
try {
clazz = (Class<Job>) Class.forName("package.two." + className);
} catch (ClassNotFoundException ex1) {
//some error handling code here, as the class is
//in neither of the two packages
}
}
Mehr Pakete diese erhalten hässlicher und mehr unlesbar wird. Darüber hinaus ist es - für mich - gegen das Konzept der Ausnahmen als Ausnahmen sollten nicht erwartet werden/verwendet für flow-control!
Gibt es eine Möglichkeit zu umschreiben, dass diese ohne die Nutzung der ClassNotFoundException
?
- warum nicht u eine Schleife verwenden, um zu überprüfen, jedes Paket mit einer Pause, wenn Sie nicht erreichen, Ausnahme?
- oder Sie rufen rekursiv die gleiche Methode im catch-block mit einem anderen Klassennamen
- dies ist nicht eine (vollständige) Lösung, denn er kann sein Interesse an einer Klasse, die innerhalb einer bestimmten Bibliothek. Wenn es einen Weg gibt, um eine Liste der geladenen Klassen in den Klassenpfad zur Laufzeit...
- Warum können Sie nicht erwarten, dass vollständig qualifizierte Namen statt nur der name einer Klasse ?. Wer ist die Angabe von Klasse, Namen ? stattdessen können Sie pass vollständig qualifizierten Klassennamen Recht ?
- der name der Klasse ist in einer Datenbank gespeichert und es ist kein kleines Projekt. möglicherweise haben viele Nebenwirkungen, zu wechseln, zu voll-qualifizierten Klassennamen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würd ich mich auf die
Class.forName
Methode für, die.Können Sie speichern die Klassen-und package-Namen in
Collection
s oderSet
s und eine Schleife durch die Elemente. Wenn Sie einenClassNotFoundException
Sie nur weiterhin Ihre Suche. Wenn Sie nicht bekommen, eine Ausnahme, beenden Sie die Schleife mitbreak
, wie Sie gefunden haben, die Klasse, die Sie gesucht haben.Dem Grund würde ich gehen für
Class.forName
ist, dass es lädt die Klasse für Sie, wenn nicht bereits geladen ist, die von der VM. Dies ist eine ziemlich mächtige Nebenwirkung.Es im Grunde entlastet Sie von der Mühe der Graben durch die ganze
CLASSPATH
und auf der Suche nach class-Dateien zu laden in die VM und den Umgang mit Fragen wie, ob die Klasse bereits geladen wurde oder nicht durch die VM.EDIT:
Jakob Jenkov geschrieben hat einige wirklich gute Artikel/tutorials zu Java. Die ich gefunden habe, sind Sie sehr nützlich beim Umgang mit Reflexion, class loader und Parallelität (einige der "härtesten" Aspekte von Java).
Hier's einen guten Artikel auf der Java-class-loader von ihm, denn wenn du dich immer noch entscheiden, nicht zu verwenden
Class.forName
.Class.forName
.forName
nutzen und so eine Schleife, wie Sie geschrieben und die anderen Antworten umgesetzt.Können Sie Guave nachdenken utilities, um die ClassInfo jeder Klasse geladen, in der classpath.
In der Schleife, die Sie implementieren können, die Ihre eigene Logik zum laden der Klasse mit den
className
Sie uns zur Verfügung stellen.In diesem Fall, ich würde nicht sorgen über die Verwendung der
ClassNotFoundException
. Während im Allgemeinen Fall kann gemacht werden, nicht zu verwenden, Ausnahmen für die Ablaufsteuerung, die es hier kaum zählt als solche.Ich würde wahrscheinlich wickeln Sie es in eine Funktion, wie so
zurückkehren oder die Klasse direkt, wenn Sie so wollen