Kotlin中使用lateinit和不使用lateinit有很大的区别,尤其是在使用自定义注解反射获取对应属性时,一不注意就可能出现问题!
如下图,声明两个变量,一个使用lateinit,一个不使用,同时使用自定义的注解进行注解。
运行之后会发现没有lateinit关键字声明的变量会报错,自定义的注解处理器找不到该变量:
可以看到报错信息明确表示了找不到private属性,但是上面的变量没有声明private变量啊?这是怎么回事?
其实原因在于自定义的注解处理器是使用的Java反射获取类中的属性,(顺便说一下,Kotlin有自己的反射方式,功能会更强大,也许不会出现这个问题,但是他的耗时非常夸张,因此才改用Java反射,不知道现在Kotlin2.0中有没有得到改善…)既然是Java反射,那就要看Java代码了,反编译一下Kotlin代码!
反编译之后的结果可以看到,lateinit修饰的变量是public的,而普通的则是private的,至此,报错真凶就找到了!
至于原理暂时还不清楚,有知道的可以留言讨论一下~