Java线程注解无法用于Kotlin无幕后字段属性的解决方案咨询
解决Kotlin中Java线程注解无法用于无幕后字段属性的问题
问题根源
你用的@UiThread、@AnyThread、@WorkerThread这类Java注解,它们的@Target定义只包含Java的元素类型(比如METHOD、TYPE),但Kotlin里无幕后字段的属性(比如val order get() = value.order)属于PROPERTY或PROPERTY_GETTER类型,不在Java注解的目标范围内,所以直接标注会报错。
可行解决方案
1. 给Java注解加@get:前缀
不用修改注解本身,直接通过Kotlin的注解目标前缀指定把注解应用到属性的getter方法上(getter编译后对应Java的METHOD,正好符合原注解的要求):
@get:UiThread val order get() = value.order
这样编译器会把@UiThread注解绑定到该属性的getter方法上,既能通过线程检查,又符合原注解的使用规则。
2. 自定义适配Kotlin的线程注解
如果觉得前缀写法繁琐,可以自己写一套Kotlin专属的线程注解,明确支持Kotlin的属性和getter:
import kotlin.annotation.AnnotationTarget.* @Target(PROPERTY_GETTER, FUNCTION, PROPERTY, METHOD) @Retention(AnnotationRetention.BINARY) annotation class UiThread @Target(PROPERTY_GETTER, FUNCTION, PROPERTY, METHOD) @Retention(AnnotationRetention.BINARY) annotation class WorkerThread @Target(PROPERTY_GETTER, FUNCTION, PROPERTY, METHOD) @Retention(AnnotationRetention.BINARY) annotation class AnyThread
之后就能直接按你原本的想法使用:
@UiThread val order get() = value.order
3. 改用Kotlin原生适配的注解
比如AndroidX里的@MainThread(对应@UiThread)、@WorkerThread等注解,已经适配了Kotlin的属性目标,直接使用即可:
@MainThread val order get() = value.order
另外Kotlin协程库的@MainThread注解也完全支持这种场景,兼容性更好。
内容的提问来源于stack exchange,提问作者Renetik
相关产品推荐
相关产品推荐

