问题:1 Gson 解析DataClass 默认值不生效的问题
前置条件:Gson创建对象的三种方式:
- newDefaultConstructor。通过反射无参构造函数来生成对象
- newDefaultImplementationConstructor。通过反射为 Collection 和 Map 等集合框架类型来生成对象
- newUnsafeAllocator。通过 Unsafe 包来生成对象,是最后兜底的方案
DataClass 没有默认的构造函数,第二种也不满足,暂时不知道。所以DataClass走的是第三种方式。通过Unsafe创建。
Unsafe 提供了一个非常规实例化对象的方法:allocateInstance,该方法提供了通过 Class 对象就可以创建出相应实例的功能,而且不需要调用其构造函数、初始化代码、JVM 安全检查等,即使构造函数是 private 的也能通过此方法进行实例化。
因为DataClass的默认值一般都是在构造函数中设置的,而通过Unsafe创建的对象,不会走构造函数。
解决办法:
1 提供一个无参构造函数,让 Gson 通过反射该函数来实例化 UserBean,从而同时进行默认值赋值
2 可以通过向构造函数添加一个 @JvmOverloads 注解来解决,这种方式实际上也是通过提供一个无参构造函数来解决问题的。所以缺点就是需要每个构造参数都提供默认值,所以才能生成无参构造函数
3 这种方式和前两种类似,也是通过间接提供一个无参构造函数来实现的。将所有字段都声明在类内部而非构造参数,此时声明的字段也一样具有默认值