Hi,
ich habe eine Anwendung, die über Plugins erweiterbar ist. Über die Schnittstelle eines Plugins kann eine bestimmte Klasse generiert werden, welche von einer (mir bekannten) abstrakten Klasse erbt:
Diese, von diesem Interface generierten Klassen (erben von meiner abstrakten Klasse Style), schreibe ich in eine ArrayList<Style> in meiner Editor-Klasse (Name: edit). Beim Beenden des Programms wird diese ArrayList<Style> über einen ObjectOutputStream gespeichert:
Soweit funktioniert auch alles ohne Probleme, aber wenn ich diese Styles dann wieder laden möchte:
Bekomme ich eine ClassNotFoundException für eine Klasse, die von Style erbt (BetweenStyle), beim letzten Beenden in der Style-Liste von edit war und in einer externen JAR liegt. Die Exception wird durch
geworfen.
Leider habe ich noch nicht sonderlich viel Erfahrung mit Reflection und ClassLoadern, kann mir evtl. jemand zeigen, wo mein Fehler liegt? Danke!
ich habe eine Anwendung, die über Plugins erweiterbar ist. Über die Schnittstelle eines Plugins kann eine bestimmte Klasse generiert werden, welche von einer (mir bekannten) abstrakten Klasse erbt:
Code:
public interface StyleView {
public Component getComponent();
public Style generateStyle();
public Class<? extends Style> getStyleClass();
public void setStyle(Style style);
}
Diese, von diesem Interface generierten Klassen (erben von meiner abstrakten Klasse Style), schreibe ich in eine ArrayList<Style> in meiner Editor-Klasse (Name: edit). Beim Beenden des Programms wird diese ArrayList<Style> über einen ObjectOutputStream gespeichert:
Code:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(ClassTools.getMainDir(getClass()) + "/../settings/stand.syl"));
oos.writeObject(edit.getStyles());
oos.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}));
Soweit funktioniert auch alles ohne Probleme, aber wenn ich diese Styles dann wieder laden möchte:
Code:
try {
File f = new File(ClassTools.getMainDir(getClass()) + "/../settings/stand.syl");
if (f.exists()) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(ClassTools.getMainDir(getClass()) + "/../settings/stand.syl"));
ArrayList list = (ArrayList)ois.readObject();
for (Object obj : list) {
edit.addStyle((Style)obj);
}
}
}
catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
Bekomme ich eine ClassNotFoundException für eine Klasse, die von Style erbt (BetweenStyle), beim letzten Beenden in der Style-Liste von edit war und in einer externen JAR liegt. Die Exception wird durch
Code:
ois.readObject();
geworfen.
java.lang.ClassNotFoundException: de.stkiese.ss.BetweenStyle
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.ibjectInputStream.resolveClass(Unknown Source)
at java.ibjectInputStream.readNonProxyDesc(Unknown Source)
at java.ibjectInputStream.readClassDesc(Unknown Source)
at java.ibjectInputStream.readOrdinaryObject(Unknown Source)
at java.ibjectInputStream.readObject0(Unknown Source)
at java.ibjectInputStream.readObject(Unknown Source)
at java.util.ArrayList.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.ibjectStreamClass.invokeReadObject(Unknown Source)
at java.ibjectInputStream.readSerialData(Unknown Source)
at java.ibjectInputStream.readOrdinaryObject(Unknown Source)
at java.ibjectInputStream.readObject0(Unknown Source)
at java.ibjectInputStream.readObject(Unknown Source)
at de.stkiese.se.cntr.Control.<init>(Control.java:52)
at de.stkiese.se.SyntaxEditor.main(SyntaxEditor.java:28)
Leider habe ich noch nicht sonderlich viel Erfahrung mit Reflection und ClassLoadern, kann mir evtl. jemand zeigen, wo mein Fehler liegt? Danke!