通过 Kotlin Reflect 看不到 Jackson 注释
Jackson annotation not visible via Kotlin Reflect
出于某种原因,Kotlin Reflect 确实在成员 属性 上看到了我的自定义注释,但没有看到 Jackson 一个。尽管 Jackson 注释被 Jackson 本身检测到并使用。最小片段(REPL 中的 运行 因此 Line_5$A
类名):
annotation class A
class C {
@A
@com.fasterxml.jackson.annotation.JsonProperty
var x: Int = 0
}
C::class.memberProperties.forEach { println(it.annotations.map{it.annotationClass}) }
输出:[class Line_5$A]
预计:[class Line_5$A, class com.fasterxml.jackson.annotation.JsonProperty]
我怎样才能在这里访问 Jackson 注释?
好的,发现 Jackson 注释附加到 Java 字段,而不是 Kotlin 属性。所以这个解决方法有效:
println(C::class.memberProperties.first().javaField!!.declaredAnnotations.get(0).annotationClass)
输出:class com.fasterxml.jackson.annotation.JsonProperty
更新:
如果使用数据 class 那么这个:
import kotlin.reflect.full.primaryConstructor
data class C (
@com.fasterxml.jackson.annotation.JsonProperty
var x: Int = 0
)
val prop = C::x
println(C::class.primaryConstructor
?.parameters
?.find { it.name == prop.name }
?.annotations
?.first()
?.annotationClass
)
输出:class com.fasterxml.jackson.annotation.JsonProperty
出于某种原因,Kotlin Reflect 确实在成员 属性 上看到了我的自定义注释,但没有看到 Jackson 一个。尽管 Jackson 注释被 Jackson 本身检测到并使用。最小片段(REPL 中的 运行 因此 Line_5$A
类名):
annotation class A
class C {
@A
@com.fasterxml.jackson.annotation.JsonProperty
var x: Int = 0
}
C::class.memberProperties.forEach { println(it.annotations.map{it.annotationClass}) }
输出:[class Line_5$A]
预计:[class Line_5$A, class com.fasterxml.jackson.annotation.JsonProperty]
我怎样才能在这里访问 Jackson 注释?
好的,发现 Jackson 注释附加到 Java 字段,而不是 Kotlin 属性。所以这个解决方法有效:
println(C::class.memberProperties.first().javaField!!.declaredAnnotations.get(0).annotationClass)
输出:class com.fasterxml.jackson.annotation.JsonProperty
更新: 如果使用数据 class 那么这个:
import kotlin.reflect.full.primaryConstructor
data class C (
@com.fasterxml.jackson.annotation.JsonProperty
var x: Int = 0
)
val prop = C::x
println(C::class.primaryConstructor
?.parameters
?.find { it.name == prop.name }
?.annotations
?.first()
?.annotationClass
)
输出:class com.fasterxml.jackson.annotation.JsonProperty