相关类: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
- InstanceCreators
private final Map<Type, InstanceCreator<?>> instanceCreators
- InstanceCreator
public interface InstanceCreator<T> { public T createInstance(Type type); }
它是一个接口,由用户实现,目的是解决找不到无参构造函数造成的问题。有些类没有无参构造函数,Gson会报错,最简单的解决办法当然是加上无参构造函数,但是某些情况下我们可能不愿意加,有些情况这个类我们没有权限加。所以我们可以写一个
InstanceCreator
实现createInstance
方法,并返回一个对象,默认值不用管,因为Gson
会把序列化后的值覆盖写入。
—— InstanceCreator.java
3. 下面尝试默认的构造函数
无非就是反射获取无参构造函数,获取对象。
4. 下面尝试newDefaultImplementationConstructor
通过多个if结合isAssignableFrom()
方法,判断该类是否是常见集合类及其子类,比如Map、List、Set、Queue、Array等。
5. 最后尝试newUnsafeAllocator
这里成功后都是返回一个对象继承自
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)`方法
网友评论