Gson 是如何创建对象的

2021-02-03  本文已影响0人  小强开学前

相关类: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<List<@kotlin.jvm.JvmSuppressWildcards User>>(){}
println(typeToken.type)
println(typeToken.rawType)

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

java.util.List<com.example.android.test.User>
interface java.util.List

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

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

4. 下面尝试newDefaultImplementationConstructor

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

5. 最后尝试newUnsafeAllocator

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

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

return new UnsafeAllocator() {
 @Override
 @SuppressWarnings("unchecked")
 public <T> T newInstance(Class<T> 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. 放弃

上一篇 下一篇

猜你喜欢

热点阅读