Kotlin数据类通过反射无法找到Java注解问题咨询
问题解答:Kotlin数据类中@JsonProperty注解反射不可见的原因
这绝对不是bug哦,问题出在Kotlin注解的默认目标行为上,下面给你详细拆解:
核心原因:Kotlin注解的默认目标规则
在Kotlin里,当你直接给数据类的属性(比如val id: String)加注解时,这个注解默认会绑定到构造函数的参数上(对应ElementType.PARAMETER),而不是类的字段或者getter方法。
刚好你用的@JsonProperty注解的@Target列表里包含了PARAMETER,所以这个注解会被乖乖放到LossDocument构造函数的id参数上——这就是为啥你通过declaredFields找字段注解、或者通过getId方法找方法注解时,都找不到它的原因。
解决方案:显式指定注解的目标位置
要让注解绑定到字段或者getter方法上,你只需要用Kotlin的注解目标限定符明确指定就行:
- 想绑定到字段:用
@field:JsonProperty("id"),这也是你已经验证有效的方式,此时通过declaredFields就能找到注解 - 想绑定到getter方法:用
@get:JsonProperty("id"),这时你通过getId方法的annotations就能查到它
举个直观的例子:
@JsonIgnoreProperties(ignoreUnknown = true) data class LossDocument( @field:JsonProperty("id") val id: String, // 注解绑定到字段 @get:JsonProperty("name") val name: String // 注解绑定到getter方法 )
补充小知识
为啥Java里直接加注解就能找到?因为Java中给字段加注解时,默认目标就是字段本身;但Kotlin为了兼顾构造函数参数、字段、getter等多种场景,设计了不同的默认规则,这是语言特性的差异,完全不是Jackson或者Kotlin的bug哦。
内容的提问来源于stack exchange,提问作者Michael Böckling
相关产品推荐
相关产品推荐

