前言
在Java中创建一个对象有三种方式:
- 通过new字段创建
- 通过反射构造方法来创建对象
- Unsafe类创建实例
Unsafe类创建实例
Unsafe类创建对象没有使用构造方法,使用了Field unsafe.allocateInstance(xxx.class);
kotlin空安全
fun one(msg:String){
}
fun two(msg:String?){
}
反编译java后发现one方法中有Intrinsics.checkParameterNotNull(msg,"msg");检查的方法。如果java 调用one传入null是会异常的。
class KUser1(var name:String)
data class KUser2(var name:String)
kotlin中不管是class还是data class都不会帮助生成无参构造函数。但是java是默认生成无参构造函数的。
但是给构造函数默认值,则会帮助生成无参构造函数的。
class KUser3(var name: String = "")
kotlin 序列化
kotlin序列化或反序列化框架正常工作,最好提供以下无参构造函数。
data class KUser(var name:String="123",var age:Int)
fun main(){
val gson= Gson()
val person=gson.fromJson<KUser>(""" {"age":"12"} """,KUser::class.java)
println(person.name)
}
// 没有无参构造函数,有属性没有默认值,用unsafe构造出函数,不管你给没给默认值,所有的属性都为null
输出:null
//不会空指针异常
Koltin中有n个属性,必须把n个属性都设置了默认值,才会生成默认的无参构造函数,少一个都不会生成无参构造函数。在没有无参构造函数,gson的反序列化走了unsafe直接构造出了对象,绕过了kotlin的空安全判定,所以不报错,输出null。