Kotlin得到Field Annotation总是空的

Gri*_*118 6 reflection annotations kotlin

我有以下Kotlin注释

@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
annotation class Field(val value: String)
Run Code Online (Sandbox Code Playgroud)

以及以下测试代码

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

}
Run Code Online (Sandbox Code Playgroud)

它将打印以下输出:

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
Run Code Online (Sandbox Code Playgroud)

为什么我看不到带有Kotlin反射的注释?需要确定字段和属性getter上是否存在给定的注释.

Bak*_*aii 9

你的注解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
}
Run Code Online (Sandbox Code Playgroud)

您对idand 的注释string是针对字段的,因此您在第二个循环中所做的操作是正确的。由于member.annotationsReturns Annotation[],您必须List在打印之前将其更改为 a 。

for(member in obj.javaClass.declaredFields) {
    println(member)
    println(member.annotations.toList())  //Add .toList()
}
Run Code Online (Sandbox Code Playgroud)

输出:

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])]
Run Code Online (Sandbox Code Playgroud)