在一些动态程序中,时常有这种情况:通过记录的类型信息,动态构造一个类的对象。通常的方法就是采用Class.newInstance()方法来做到。但是这个方法要求这个Class一定具有一个Nullary Constructor,即没有参数的构造函数。如果此Class明确的声明了一个带有参数的Constructor,newInstance就会报出InstantiationException。类似的,还可以通过Class.getConstructor(...)来获取某个构造函数,再newInstance(...)。然而,这还是要求使用者一定提前知道目标Class具有某个特别的Constructor才可以。这在一定程度上限制动态程序的范围。
然而,很明显的,实现Serializable接口的Class明显不受这个限制的约束。任凭你怎么随便定义Constructor,ObjectInputStream.readObject()都能很好的把那个对象生成出来。这个过程是通过ObjectStreamClass这个类来完成的。ObjectStreamClass内部维护一组类型数据,来获取某个Class对应的ObjectStreamClass对象(lookup方法)。当readObject时,就获取这个类型信息,并newInstance()。通过查看代码可以发现这也是通过找到某个无参构造函数得到的。这就是ObjectStreamClass。getSerializableConstructor(Class cl)。此方法查找目标类型的继承体系中第一个没有实现Serilizable的类的Nullary Constructor。这对绝大部分的Class来讲都会找到Object类的那个无参构造函数。此构造函数一定存在。因此,一定能找到。然而,Object的构造函数