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:
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
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.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.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.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.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!