Ich versuche Class.forName zu verwenden, um dynamisch eine Klasse aus einer JAR-Datei auf dem Dateisystem zur Laufzeit zu laden. Die Klasse, die ich zu laden versuche, implementiert eine Schnittstelle in einer anderen .jar-Datei. Daher verwende ich meinen eigenen URLClassLoader, um auf die beiden .jars zu verweisen.Problem mit Java Class.forName
Der Code funktioniert, wenn er nicht im Kontext der Web-App aufgerufen wird (ich habe dies getestet, indem ich die Methode in ein separates Programm kopiert und eingefügt habe und von main aus aufgerufen habe). Wenn ich jedoch die Web-App starte/debugge (ich verwende NetBeans), schlägt der Code fehl. Die newInstance-Methode löst eine ClassCastException aus, wenn ich versuche, die Instanz auf die in der Datei jar_file_dependencies.jar angegebene Schnittstelle zu konvertieren.
Hier ist der relevante Code, ob das hilft:
File gameJar = new File("C:\\file_path\\jar_file.jar");
File gameDependenciesJar = new File("C:\\file_path\\jar_file_dependencies.jar");
URLClassLoader cl = new URLClassLoader(new URL[]
{
gameJar.toURI().toURL(),
gameDependenciesJar.toURI().toURL()
});
Class clazz = Class.forName("MyClass", true, cl);
IMyClass myClass = (IMyClass)clazz.newInstance();
System.out.println(game);
} catch (Exception e)
{
System.out.println(e.getMessage());
}
Irgendwelche Vorschläge, warum dieser Code in einem Programm zu arbeiten und nicht ein anderer wäre sehr dankbar.
Vielen Dank, Dan
Könnte es dieses Problem sein: http://stackoverflow.com/questions/2081000/java-lang-classcastexception-when-casting-object-result-of-java-lang-reflect-met? – Lars
@Lars, ich denke das ist in der Tat das Problem. Ich würde dasselbe vorschlagen - geben Sie dem URLClassLoader einen Elternteil. –