Hallo,
ich lade einige Klassen dynamisch zur Laufzeit. Funktioniert normalerweise problemlos.
Nun ist es so, dass aber manche Klassen von mir definierte Datentypen verwenden, Die Klasse des Datentyps ist dynamisch (der Pfad dorthin) und somit kann ich das Problem nicht durch den Classpath lösen.
Ich dachte mir ich lade einfach bevor ich die eigentliche Klasse lade, die von dieser benötigten Klassen ebenfalls mittels ClassLoader. Leider Funktioniert das nicht ganz.
Hier mal mein Code zum laden der eigentlichen Klasse:
Hier die Methode zum laden der benötigten datentypen:
Wäre top wenn mir jemand helfen könnte, stehe nämlich gerade auf dem Schlauch und weiß net warum es nicht geht...
Vielen Dank schon mal
LG
Alex
ich lade einige Klassen dynamisch zur Laufzeit. Funktioniert normalerweise problemlos.
Nun ist es so, dass aber manche Klassen von mir definierte Datentypen verwenden, Die Klasse des Datentyps ist dynamisch (der Pfad dorthin) und somit kann ich das Problem nicht durch den Classpath lösen.
Ich dachte mir ich lade einfach bevor ich die eigentliche Klasse lade, die von dieser benötigten Klassen ebenfalls mittels ClassLoader. Leider Funktioniert das nicht ganz.
Hier mal mein Code zum laden der eigentlichen Klasse:
Java:
if (!new File(lClassFileReference).exists()) {
lResult = false;
} else {
Class<?> lClass = null;
try {
// Load class generated by the a4l file
URL[] lTest = new URL[1];
File lFile = new File(lPathToJava);
lTest[0] = new URL(lFile.toURI().toURL().toString());
URLClassLoader lLoader = new URLClassLoader(lTest);
lClass = lLoader.loadClass(lClassFileWithotExtension);
Class[] lDatatypeClasses = loadDatatypes(lLoader); //<<<< laedt die datentypen
} catch (Exception Ex) {
Ex.printStackTrace();
}
// Check whether the given file has a main method or not
Method[] lMethods = lClass.getMethods(); //<<<<Liefert mir den NoClassDefFoundError
Hier die Methode zum laden der benötigten datentypen:
Java:
private static Class[] loadDatatypes(URLClassLoader pLoader) {
Class[] lResult = null;
String lBinDirectoryPath = A4LWizard.getDefault().getPreferenceStore().getString(A4LWizard.KEY_FOR_STANDARDLIBRARY_LOCATION_PREFERENCE);
lBinDirectoryPath += System.getProperty("file.separator") + "bin";
String lDatatypesDirectoryPath = lBinDirectoryPath + System.getProperty("file.separator") + "datatypes";
File lDirectory = new File(lDatatypesDirectoryPath);
File[] lClassFiles = lDirectory.listFiles(new FilenameFilter(){
public boolean accept(File dir, String name){
return name.endsWith(".class");
}
});
URL[] lAvailablieURLs = pLoader.getURLs();
URL[] lNewURLs = new URL[lAvailablieURLs.length + 1];
int i = 0;
for(URL lCurrent : lAvailablieURLs) {
lNewURLs[i] = lCurrent;
i++;
}
if(lClassFiles != null && lClassFiles.length > 0) {
lResult = new Class[lClassFiles.length];
for(i = 0; i < lClassFiles.length; i++) {
String lCurrentClassName = "datatypes." + lClassFiles[i].getName().substring(0, lClassFiles[i].getName().lastIndexOf("."));
try {
// Load datatypes which may be used by the a4l class
lNewURLs[lAvailablieURLs.length] = new URL((new File(lBinDirectoryPath)).toURI().toURL().toString());
URLClassLoader lLoader = URLClassLoader.newInstance(lNewURLs, pLoader);
lResult[i] = lLoader.loadClass(lCurrentClassName);
} catch (Exception Ex) {
Ex.printStackTrace();
}
}
}
return lResult;
}
Wäre top wenn mir jemand helfen könnte, stehe nämlich gerade auf dem Schlauch und weiß net warum es nicht geht...
Vielen Dank schon mal
LG
Alex