使用obj :: class.declaredMemberProperties查找字段注释

时间:2018-07-06 22:22:16

标签: reflection kotlin annotations

在以下测试中,类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?
    }

}

1 个答案:

答案 0 :(得分:0)

我在Kotlin讨论组中得到了提示,现在可以自己回答:

将Kotlin的“属性”编译到一个支持字段及其getter / setter函数。如果使用目标字段而不是目标属性,则注释将应用于后备字段。但是,在Kotlin中不存在纯后备字段,因此必须通过.javaField来访问它们:

val idField = obj::class.memberProperties.first { it.name == "id" }.javaField!!
assertNotNull(idField.getAnnotation(Foo::class.java))