Gson 是如何创建对象的

相关类:com.google.gson.internal.ConstructorCOnstructor.java

1. 首先用type尝试InstanceCreators(first try an instance creator)

2. 下面用rawType尝试InstanceCreators(Next try raw type match for instance creators)


Type 和 rawType 区别,其实就是去掉了泛型

val typeToken = object :TypeToken>(){}
println(typeToken.type)
println(typeToken.rawType)

--------------CONSOLE --------------

java.util.List
interface java.util.List

  • InstanceCreators
    private final Map> instanceCreators
  • InstanceCreator
      public interface InstanceCreator {
        public T createInstance(Type type);
      }
    

    它是一个接口,由用户实现,目的是解决找不到无参构造函数造成的问题。有些类没有无参构造函数,Gson会报错,最简单的解决办法当然是加上无参构造函数,但是某些情况下我们可能不愿意加,有些情况这个类我们没有权限加。所以我们可以写一个InstanceCreator实现createInstance方法,并返回一个对象,默认值不用管,因为Gson会把序列化后的值覆盖写入。
    —— InstanceCreator.java

3. 下面尝试默认的构造函数

无非就是反射获取无参构造函数,获取对象。

4. 下面尝试newDefaultImplementationConstructor

通过多个if结合isAssignableFrom()方法,判断该类是否是常见集合类及其子类,比如Map、List、Set、Queue、Array等。

5. 最后尝试newUnsafeAllocator

Unsafe类在Java中是不可或缺的存在

这里成功后都是返回一个对象继承自UnsafeAllocator并重写newInstance(Class c)方法,然后外部再调用newInstance方法完成所需对象的创建。

return new UnsafeAllocator() {
 @Override
 @SuppressWarnings("unchecked")
 public  T newInstance(Class c) throws Exception {
   assertInstantiable(c);
   return (T) allocateInstance.invoke(unsafe, c);
 }
};

1 使用sun.misc.Unsafe类创建对象

- 反射获取`theUnsafe`对象
- 反射获取 `theUnsafe`对象的`allocateInstance(Class class)`方法

2 使用java.io.ObjectStreamClass类创建对象(Android 2.3 及以后)

- 反射调用`ObjectStreamClass.getConstructorId()`方法获取`constructorId`值
- 反射获取`ObjectStreamClass.newInstance(int constructorId)`方法

3 使用java.io.ObjectStreamClass类创建对象(Android 2.3 及以前)

- 反射获取`ObjectStreamClass.newInstance(Class class)`方法

4 放弃

6. 放弃

你可能感兴趣的:(Gson 是如何创建对象的)