Reflection Kotlin获取字段注释始终为空

Reflection Kotlin获取字段注释始终为空,reflection,annotations,kotlin,Reflection,Annotations,Kotlin,我有下面的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")

我有下面的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)
    }
  }

}

为什么我看不到带有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
}
输出:

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])]
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])]