Kotlin总是空的Field Annotation

我有以下Kotlin注释

@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER) @Retention(AnnotationRetention.RUNTIME) annotation class Field(val value: String) 

和下面的测试代码

 class TestObject(@field:Field("id") val id: Long) { @field:Field("string") val string = "Hello world" @get:Field("prop") val prop get() = string } class AnnotationTest { @Test fun test() { val obj = TestObject(200L) for (member in obj::class.declaredMemberProperties) { if (member.findAnnotation<Field>() != null) { println(member) } println(member) println(member.annotations) } println("#########") for(member in obj.javaClass.declaredFields) { println(member) println(member.annotations) } } } 

它将打印下面的输出:

 val TestObject.id: kotlin.Long [] val TestObject.prop: kotlin.String [] val TestObject.string: kotlin.String [] ######### private final java.lang.String TestObject.string [Ljava.lang.annotation.Annotation;@33d512c1 private final long TestObject.id [Ljava.lang.annotation.Annotation;@515c6049 

为什么我不能用Kotlin反射看到注释? 需要找出给定的注释是否出现在字段和属性获取器上。

prop注解是针对getter,而不是在属性上调用findAnnotation ,你必须在属性的getter上调用它。

 for (member in obj::class.declaredMemberProperties) { if (member.getter.findAnnotation<Field>() != null) { //add .getter println(member) } println(member) println(member.getter.annotations) //add .getter } 

你的idstring注释是目标字段,所以你在第二个循环中做的是正确的。 由于member.annotations返回Annotation[] ,所以在打印之前必须将其更改为List

 for(member in obj.javaClass.declaredFields) { println(member) println(member.annotations.toList()) //Add .toList() } 

输出:

 val TestObject.id: kotlin.Long [] val TestObject.prop: kotlin.String val TestObject.prop: kotlin.String [@Field(value=[prop])] val TestObject.string: kotlin.String [] ######### private final java.lang.String TestObject.string [@Field(value=[string])] private final long TestObject.id [@Field(value=[id])]