2016-04-09 12 views
0

Ich versuche ein Klassenobjekt aus einer kompilierten Klassendatei zu laden, die sich in meinem Desktop-Verzeichnis befindet.Laden von externen Klassendateien ohne Berücksichtigung von Klassenpfaden oder Paketen

Ich füttere zwei Argumente zu main in meinem Programm, das URLClassLoader verwendet, um eine Instanz einer Klasse aus einer kompilierten Datei TheClassToLoad.class zu erhalten.

ich habe, in Haupt des Classloading Programms: (args[0] is for something unrelated)

String classFile_FilePath = args[1]; 
String className = args[2]; 
URL classUrl = new URL(classFile_FilePath); 
URLClassLoader ucl = new URLClassLoader(new URL[]{classUrl}); 

Wenn dieses Programm von der Shell ausgeführt wird, während im Projektverzeichnis:

Me:ClassLoadingProgramRootDir Me$ java com.company.Main argZero file:///Users/Me/Desktop/ TheClassToLoad.class

I eine erhöhte Ausnahme finden:

Ausnahme im Thread "Haupt" java.la ng.ClassNotFoundException: TheClassToLoad.class

So gibt es eine Datei TheClassToLoad.class in Desktop/ noch URLClassLoader eine Ausnahme auslöst, ohne das Detail Bereitstellung Ich muss die Situation debuggen.

Ich bin neu in Java und bin mir bewusst, dass Klassenpfade wie com.company.Class oft benötigt wird, um auf den tatsächlichen Klassennamen einer Klasse basierend auf der Paketverzeichnisstruktur zu verweisen. In diesem Fall werde ich jedoch einfach gebeten, dass URLClassLoader mir eine Instanz des Klassenobjekts für eine beliebige kompilierte Klassendatei gibt, die irgendwo auf einer Maschine sitzt.

+1

Wenn Ihre Klasse eine 'Paket'-Anweisung hat, müssen Sie sie beim Versuch, sie zu laden und zu verwenden, respektieren. – bmargulies

Antwort

1

Für URLClassLoader sollte die URL von dem Verzeichnis sein, das die Klasse + Paketstruktur enthält, nicht die Klassendatei selbst. In Ihrem Fall sollte es file:///Users/Me/Desktop/ sein.

Das Argument für loadClass sollte der Name der Klasse sein, nicht der Name der Klassendatei. In Ihrem Fall sollte es TheClassToLoad sein.

Wenn die Klasse in einem Paket ist (zB my.pkg.TheClassToLoad), dann sollten Sie diese Klassennamen als Argument für loadclass verwenden und die URL für URLClassLoader sollte noch die Wurzel der Paketstruktur sein (zB file:///Users/Me/Desktop, wenn die Datei ist file:///Users/Me/Desktop/my/pkg/TheClassToLoad.class).

+0

danke, nicht die Verwendung der "vollständige Angabe" Klassenname war die Ursache –