Reflection Kotlin获取字段注释始终为空
我有下面的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")
@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])]