Kotlin lateinit

Kotlin中使用lateinit和不使用lateinit有很大的区别,尤其是在使用自定义注解反射获取对应属性时,一不注意就可能出现问题!
如下图,声明两个变量,一个使用lateinit,一个不使用,同时使用自定义的注解进行注解。
![[Pasted image 20240904113613.png]]

运行之后会发现没有lateinit关键字声明的变量会报错,自定义的注解处理器找不到该变量:
![[Pasted image 20240904114000.png]]

可以看到报错信息明确表示了找不到private属性,但是上面的变量没有声明private变量啊?这是怎么回事?
其实原因在于自定义的注解处理器是使用的Java反射获取类中的属性,(顺便说一下,Kotlin有自己的反射方式,功能会更强大,也许不会出现这个问题,但是他的耗时非常夸张,因此才改用Java反射,不知道现在Kotlin2.0中有没有得到改善…)既然是Java反射,那就要看Java代码了,反编译一下Kotlin代码!
反编译之后的结果可以看到,lateinit修饰的变量是public的,而普通的则是private的,至此,报错真凶就找到了!
![[Pasted image 20240904113533.png]]

至于原理暂时还不清楚,有知道的可以留言讨论一下~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值