gpt4 book ai didi

reflection - Kotlin 获取字段注释始终为空

转载 作者:IT老高 更新时间:2023-10-28 13:46:00 24 4
gpt4 key购买 nike

我有以下 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 反射的注解?需要找出给定的注释是否存在于字段和属性 getter 上。

最佳答案

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

关于reflection - Kotlin 获取字段注释始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46512924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com