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 }
你的id
和string
注释是目标字段,所以你在第二个循环中做的是正确的。 由于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])]