在以下测试中,类id
的字段TestData
用注解Foo
标记。为什么.annotations
和.findAnnotation<Foo>()
的输出为空?
如何检查字段是否由特定注释注释?
(这与How to list field annotations in Kotlin?的问题不同,发件人忘记将保留时间更改为RUNTIME)
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.findAnnotation
import kotlin.test.Test
class MissingAnnotationTest {
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class Foo
data class TestData(@field:Foo val id: Int)
@Test
fun test() {
val obj = TestData(123)
val idProp = obj::class.declaredMemberProperties.first { it.name == "id" }
println("1 name: " + idProp) // "val ...TestData.id: kotlin.Int"
println("1 annotations: " + idProp.annotations) // [] - but why?
println("1 found @Foo: " + idProp.findAnnotation<Foo>()) // null - but why?
}
}
答案 0 :(得分:0)
我在Kotlin讨论组中得到了提示,现在可以自己回答:
将Kotlin的“属性”编译到一个支持字段及其getter / setter函数。如果使用目标字段而不是目标属性,则注释将应用于后备字段。但是,在Kotlin中不存在纯后备字段,因此必须通过.javaField来访问它们:
val idField = obj::class.memberProperties.first { it.name == "id" }.javaField!!
assertNotNull(idField.getAnnotation(Foo::class.java))