In meinem Hauptteil habe ich die folgende Aussage
Class booki = Class.forName("Book");
was eine java.lang.ClassNotFoundException
Ausnahme auslöst
Wenn ich den vollständigen Pfad wie Class booki = Class.forName("javatests.Book");
verwende ist es ok.
Die Hauptklasse und die Buchklasse sind im selben Paket, ich habe auch versucht, import static javatests.Book.*;
zu verwenden, aber es löst immer noch die Ausnahme aus, wenn ich nicht den vollständigen Pfad javatests.Book
einstelle. Kann mir jemand erklären warum?
Von docs Class # forName
%Vor% Parameter:
Klassenname - der vollständig qualifizierte Name der gewünschten Klasse.
Das wird also nicht ClassNotFoundException
Zum Beispiel ist es nicht notwendig, java.lang.*
package in ein Java-Programm zu importieren, sondern die Klasse Thread
von java.lang
package zu laden, die Sie schreiben müssen
Das obige Codefragment gibt den Klassenklassifizierungsdeskriptor für die Klasse java.lang.Thread
Sie benötigen immer einen qualifizierten Klassennamen , es sei denn befindet sich in demselben Paket. Wenn ich eine Klasse foo in meinem Paket definiere, kann ich eine Methode Class testClass = Class.forName("foo")
aufrufen, aber ich kann Class testClass = Class.forName("SecureRandom");
auch dann nicht aufrufen, wenn ich SecureRandom importiere. So funktioniert die Funktion. Es hat wahrscheinlich eine Verknüpfung, wo es versucht, Dinge in lokalen Paketen zu finden, aber dahinter steckt nicht viel.
Erstens muss die Buchklasse im Paket javatests enthalten sein.
Die JVM lädt die Klasse anhand ihres Namens durch den Klassenpfad.
Es gibt keine Klasse namens "Buch" im Klassenpfad.
JVM gibt Ihnen eine ClassNotFoundException, wenn Sie Class.forName ("Book") entschuldigen.
Aber "Class.forName (" javatests.Book ")" sagt JVM, dass die Klasse "Book" im Paket "javatests" ist.
So kann die JVM sie finden und laden.
Ich hoffe meine Antwort ist hilfreich:)
JLS bietet die folgende Beschreibung:
Die Klassensuche erfolgt immer im Namen einer referenzierenden Klasse und erfolgt über eine Instanz von
ClassLoader
. Mit dem vollständig qualifizierten Namen einer Klasse versucht diese Methode, die Klasse zu suchen, zu laden und zu verknüpfen.
Das JDK verwendet eine Instanz von ClassLoader
, die den von der Umgebungsvariablen CLASSPATH angegebenen Satz von Verzeichnisbaumstammwörtern durchsucht. und offensichtlich ist es sich des Ortes (Paket), den es genannt wurde, nicht bewusst. Deshalb braucht es einen voll qualifizierten Namen.
Tags und Links java classnotfoundexception