Ist es möglich, Informationen wie simplyname und fullname vom Typ zu erhalten, auch wenn Sie diese Klasse zu diesem Zeitpunkt nicht geladen haben?
Solange die Klasse für den Typ vorhanden ist, wird die Klasse, auf die sich das Objekt Class
bezieht, geladen.
den Code unten:
class Test implements Serializable {
// verion UID
public Class type;
public Test(Class type) {
this.type = type;
}
}
ich serialisiert ein Test
Objekt, das die Class
für eine andere Art enthalten: Second
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("text.obj"));
out.writeObject(new Test(Second.class));
out.close();
Jetzt ist es zurück in das Lesen:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
in.close();
In diesem Code gibt es keinen Verweis auf die Klasse Second
. Wenn Second
geladen wird, wenn das obige Programm ausgeführt wird, können wir annehmen, dass es aufgrund der Deserialisierung lieber als direkte Referenz war.
Und es tut:
Also ja, werden die Dinge wie type.getSimpleName()
zu erhalten versuchen, arbeiten.
Running:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
System.out.println(test.type.getSimpleName());
in.close();
Drucke
Second
Wenn Sie die Second
Klasse löschen, erhalten Sie ClassNotFoundException
wie erwartet. Beim Lesen des Stacktrace können Sie sehen, dass das Programm versucht, die Klasse Second
zu laden:
Exception in thread "main" java.lang.ClassNotFoundException: test.Second
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.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.readClass(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(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)
Sie sollten keine unformatierten Typen verwenden. –