Einzelnen Beitrag anzeigen
Alt 11.06.2008, 09:07   #1 (permalink)
The_S
Premium-Benutzer
 
Benutzerbild von The_S
 
Registriert seit: 29.11.2004
Fachbeiträge: 11.591
Blog-Einträge: 1
Abgegebene Danke: 62
Erhielt 154 Danke für 133 Beiträge
Standard Klasse in externer JAR mit ObjectInputStream

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

Code:
ois.readObject();
geworfen.

Zitat:
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!
The_S ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen