You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:47:46