什么是合法的方式来通过反射获得纯Kotlin财产的注释,他们总是失踪?

我试图从Kotlin数据类获得注释

package some.meaningless.package.name import kotlin.reflect.full.memberProperties annotation class MyAnnotation() @MyAnnotation data class TestDto(@MyAnnotation val answer: Int = 42) fun main(args: Array<String>) { TestDto::class.memberProperties.forEach { p -> println(p.annotations) } println(TestDto::class.annotations) } 

我需要处理类的批注,使GSON的自定义名称序列化,但是无论我如何声明注释类它永远不会被检测

程序总是输出

 [] [@some.meaningless.package.name.MyAnnotation()] 

这意味着只有课堂级别的注释是存在的

正如Kotlin参考所述,如下所示:

如果您未指定使用地点目标 ,则根据所使用的注释的@Target批注选择目标。 如果有多个适用的目标,则从以下选项中选择第一个适用的目标: param > property > field

要使注解在property上注释,您应该使用站点目标 ,例如:

 @MyAnnotation data class TestDto(@property:MyAnnotation val answer: Int = 42) 

但是,在Kotlin中带有property目标的注释对于Java来说是不可见的,因此您应该使注释加倍 ,例如:

 @MyAnnotation // v--- used for property v--- used for params in Java data class TestDto(@property:MyAnnotation @MyAnnotation val answer: Int = 42) 

好的,罪魁祸首似乎是,Kotlin注释具有缺省的@Target(AnnotationTarget.CLASS) ,这在文档中没有足够的重视。

@Target添加到注释类后,它现在可以正常工作

 @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) annotation class MyAnnotation() 

现在它打印出来

 [@some.meaningless.package.name.MyAnnotation()] [@some.meaningless.package.name.MyAnnotation()] 

作为一个副作用,如果显式的@Target不存在,只会保留类级别的注释,但是不执行有效性检查,所以强制编译器根据需要检查是否应用了注释。