什么是合法的方式来通过反射获得纯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
不存在,只会保留类级别的注释,但是不执行有效性检查,所以强制编译器根据需要检查是否应用了注释。