在 Kotlin 数据类上的每次反射中找不到 Java 注释

Mic*_*ing 3 java reflection annotations kotlin

给定这个 Java 注释

@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonProperty
Run Code Online (Sandbox Code Playgroud)

和这个 Kotlin 数据类

@JsonIgnoreProperties(ignoreUnknown = true)
data class LossDocument(@JsonProperty("id") val id: String)
Run Code Online (Sandbox Code Playgroud)

我希望在这里找到注释

LossDocument::class.java.declaredFields[0].annotations
Run Code Online (Sandbox Code Playgroud)

或这里

LossDocument::class.java.declaredMethods.first { it.name == "getId" }
Run Code Online (Sandbox Code Playgroud)

但两者的注释都为零。这是一个错误吗?根据53843771,我的印象是这应该有效。我正在使用 Kotlin 1.4.0。

当我显式声明注释时,@field:JsonProperty("id")我可以使用LossDocument::class.java.declaredFields[1].annotations.

Maf*_*for 5

当您注释属性或主构造函数参数时,会从相应的 Kotlin 元素生成多个 Java 元素,因此生成的 Java 字节码中的注释有多个可能的位置。

如果您未指定使用站点目标,则根据正在使用的注释的 @Target 注释来选择目标。如果有多个适用目标,则使用以下列表中的第一个适用目标:param、property、field。--注释使用站点目标

在您的情况下,注释放置在构造函数参数上。

  • 看来这确实是解决方案,谢谢!我忘记了 Jackson 也理解 ctor 参数注释。这是我想要的回报:`LossDocument::class.java.constructors[0].parameters[0].annotations` (2认同)