从一个问题开始
假设有这么一个类:
class MyObj {
public final int x;
public MyObj(int x) {
this.x = x;
}
}
和下面的测试代码:
@Test
public void gson() {
MyObj obj = new Gson().fromJson("{\"x\":1}", MyObj.class);
Assert.assertEquals(1, obj.x);
}
那么GSON是通过什么样的方式创建
MyObj对象的呢?答案可能会出乎你的意料(至少出乎了我的意料)。
InstanceCreator和ObjectConstructor
经过断点调试或者阅读源代码不难发现,GSON是使用ObjectConstructor来创建对象实例的,这点从代码注释里也能看的出来:
/**
* Defines a generic object construction factory. The purpose of this class
* is to construct a default instance of a class that can be used for object
* navigation while deserialization from its JSON representation.
*
* @author Inderjeet Singh
* @author Joel Leitch
*/
public interface ObjectConstructor<T> {
/**
* Returns a new instance.
*/
public T construct();
}
那么ObjectConstructor从何而来呢?答案在
ConstructorConstructor里:
public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
final Type type = typeToken.getType();
final Class<? super T> rawType