2017-11-22 2 views
0

Es fällt mir schwer, den Klassenpfad für ein Verzeichnis auf ein Klassenpaket zu setzen. Ich versuche, eine JAR-Datei auszuführen, die ein Verzeichnis als Befehlszeilenargument verwendet. Das Programm verwendet das Verzeichnis, um auf Klassendateien in einem Ordner zuzugreifen, und verwendet Reflektion, um die Klassenfelder und -methoden zu untersuchen.Ich kann nicht auf Verzeichnisklassen zugreifen, nachdem ich den Klassenpfad festgelegt habe

ich dann den classlist gehen, den Namen jeder Klasse erhalten, und verwenden Sie die Class.forName() Methode die Klassen zuzugreifen.

Class c = Class.forName(className); 

Damit die obige Zeile funktioniert, muss ich den Klassenpfad auf die Adresse des Verzeichnisses festlegen, das die Klassen enthält.

ich das Programm bekommen kann ganz gut laufen, wenn ich ein Verzeichnis von Klassen bin mit, die nicht wie unten zu einem Paket gehören: für die folgende Zeile ein, jedoch

ist Monopol ein Paket und das Programm wirft einen ClassNotFoundException nach Class.forName(className)

java -cp "Explorer.jar:/Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/" explorer.ExplorerDemo /Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/ 

Für Testzwecke Aufruf habe ich versucht, Einstellung `Class.forName() aufrufen, den Paketnamen wie unten enthalten:

Class c = Class.forName("monopoly."+className); 

Dies wirft jedoch auch ClassNotFoundException.

Antwort

0

Class.forName ist eine Verknüpfung zum Abrufen von Klasseninformationen im Kontext von ClassLoader der aktuellen Klasse. Javadoc heißt es, dass dies zu

entspricht

Class.forName("Foo", true, this.getClass().getClassLoader())

Vorausgesetzt, dass Sie Klasse Verzeichnis als Runtime-Parameter angegeben und ist nicht Teil des ursprünglichen Classpath, würde ich Sie benutzerdefinierte URLClassLoader Beispiel vorschlagen instanziieren, die Ihrem Verzeichnis zeigen wird.

Beispielcode:

public class ReflectionClassAnalysis { 

    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException { 

     // URLClassLoader supports both directories and jar files 
     Path directory = Paths.get("/some/directory/"); 
     Path jar = Paths.get("/some/binary.jar"); 

     // You may be interested in providing parent ClassLoader for your new instance 
     // You can either use current class ClassLoader like 
     ClassLoader contextClassLoader = ReflectionClassAnalysis.class.getClassLoader(); 
     // or current thread ClassLoader 
     // ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 

     URLClassLoader myClassLoader = new URLClassLoader(
       new URL[]{ 
        directory.toUri().toURL(), 
        jar.toUri().toURL() 
       }, 
       contextClassLoader 
     ); 

     // You may use ClassLoader directly to load class meta 
     Class<?> externalClass = myClassLoader.loadClass("your.class.name"); 
     // or supply ClassLoader to forName method 
     // Class.forName("your.class.name", true, myClassLoader); 

     // Do your class analysis here 
    } 

} 

Für JAR mit Classpath Anweisungen finden Sie unter: Run a JAR file from the command line and specify classpath

+0

Also in Ihrem Ansatz, würden Sie nicht einmal den Classpath setzen müssen? – Brosef

+0

Nein. Sie legen das Programm programmatisch für den neuen ClassLoader fest. –

+0

Ich bin mir sicher, dass Ihr Ansatz funktioniert, aber ich würde gerne herausfinden, wie dies mit dem Klassenpfad funktioniert. – Brosef

Verwandte Themen