即使您当时没有加载该类,是否可以从 type 中获取 simplename 和 fullname 之类的信息?
只要该类型的类存在,Class 对象所引用的类就会被加载。
使用下面的代码:
class Test implements Serializable {
// verion UID
public Class type;
public Test(Class type) {
this.type = type;
}
}
我序列化了一个 Test 对象,其中包含不同类型的 Class:Second
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("text.obj"));
out.writeObject(new Test(Second.class));
out.close();
现在,重新读一遍:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
in.close();
此代码中没有对Second 类的引用。如果在运行上述程序时加载了Second,我们可以认为这是由于反序列化而不是直接引用。
确实如此:
所以是的,尝试获取 type.getSimpleName() 之类的东西会起作用。
跑步:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("text.obj"));
Test test = (Test) in.readObject();
System.out.println(test.type.getSimpleName());
in.close();
打印
Second
当您删除 Second 类时,您会按预期获得 ClassNotFoundException。通过阅读stacktrace,可以看到程序尝试加载Second类:
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)