data class TestData( val a: String, val b: String ) val data = Gson().fromJson("{}", TestData::class.java) println("a:${data.a}, b:${data.b}") //输出: a:null, b:null
现象2: 构造函数不会被调用
1 2 3 4 5 6 7 8 9
data class TestData( val a: String, val b: String ) { init { println("TestData init!!!") // 这一行代码不会执行到 } } val data = Gson().fromJson("{}", TestData::class.java)
现象3: 默认值失效
1 2 3 4 5 6
data class TestData( val a: String, val b: String = "bbb" ) val data = Gson().fromJson("{\"a\":\"aaa\"}", TestData::class.java) println("$data") //输出: TestData(a=aaa, b=null)
现象4: 当全部成员都有默认值的时候默认值和构造函数又生效了
1 2 3 4 5 6 7 8 9 10
data class TestData( val a: String = "", val b: String = "bbb" ) { init { println("TestData init!!!") // 这一行代码能执行到 } } val data = Gson().fromJson("{\"a\":\"aaa\"}", TestData::class.java) println("$data") //输出: TestData(a=aaa, b=bbb)
public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) { final Type type = typeToken.getType(); final Class<? super T> rawType = typeToken.getRawType();
// 从instanceCreators中查找,我们可以用GsonBuilder.registerTypeAdapter指定某种类型的构造器,默认情况下instanceCreators是空的 final InstanceCreator<T> typeCreator = (InstanceCreator<T>) instanceCreators.get(type); if (typeCreator != null) { return new ObjectConstructor<T>() { @Override public T construct() { return typeCreator.createInstance(type); } }; }
// 这里还是在instanceCreators里查找,只不过用rawType当key final InstanceCreator<T> rawTypeCreator = (InstanceCreator<T>) instanceCreators.get(rawType); if (rawTypeCreator != null) { return new ObjectConstructor<T>() { @Override public T construct() { return rawTypeCreator.createInstance(type); } }; }
// 判断类型是否可以实例化,例如接口和抽象类就不能实例化 final String exceptionMessage = checkInstantiable(rawType); if (exceptionMessage != null) { return new ObjectConstructor<T>() { @Override public T construct() { throw new JsonIOException(exceptionMessage); } }; }
// 最后使用sun.misc.Unsafe去兜底创建实例 if (filterResult == FilterResult.ALLOW) { return newUnsafeAllocator(rawType); } else { final String message = "Unable to create instance of " + rawType + "; ReflectionAccessFilter " + "does not permit using reflection or Unsafe. Register an InstanceCreator or a TypeAdapter " + "for this type or adjust the access filter to allow using reflection."; return new ObjectConstructor<T>() { @Override public T construct() { throw new JsonIOException(message); } }; } }
val unsafeClass = Class.forName("sun.misc.Unsafe") val theUnsafe = unsafeClass.getDeclaredField("theUnsafe") theUnsafe.isAccessible = true val unsafe = theUnsafe.get(null) val allocateInstance = unsafeClass.getMethod("allocateInstance", Class::class.java) val testData = allocateInstance.invoke(unsafe, TestData::class.java) as TestData
// Confirm all parameters are present, optional, or nullable. var isFullInitialized = allBindings.size == constructorSize for (i in 0 until constructorSize) { if (values[i] === ABSENT_VALUE) { when { constructor.parameters[i].isOptional -> isFullInitialized = false constructor.parameters[i].type.isMarkedNullable -> values[i] = null // Replace absent with null. else -> throw missingProperty( constructor.parameters[i].name, allBindings[i]?.jsonName, reader ) } } }
// Call the constructor using a Map so that absent optionals get defaults. val result = if (isFullInitialized) { constructor.call(*values) } else { constructor.callBy(IndexedParameterMap(constructor.parameters, values)) }