java.lang.ClassNotFoundException für eine angegebene Klasse

8

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?

    
Avraam Mavridis 30.10.2013, 06:16
quelle

5 Antworten

10

Class.forName löst einen vollständig qualifizierten Klassennamen für die Klasse auf. Da eine Methode nicht weiß, wo sie aufgerufen wird, kann weder das Paket der aufrufenden Klasse noch import s in der aufrufenden Klasse eine Rolle spielen.

    
Henry 30.10.2013, 06:22
quelle
2

Von docs Class # forName

%Vor%

Parameter:
Klassenname - der vollständig qualifizierte Name der gewünschten Klasse.

Das wird also nicht ClassNotFoundException

ausgeben %Vor%

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

%Vor%

Das obige Codefragment gibt den Klassenklassifizierungsdeskriptor für die Klasse java.lang.Thread

zurück     
Aniket Kulkarni 30.10.2013 06:24
quelle
0

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.

    
Vigilant 30.10.2013 06:25
quelle
0

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:)

    
kaya.rong 30.10.2013 06:38
quelle
0

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.

    
Ean V 30.10.2013 06:42
quelle

Tags und Links