我有一个关于 Kotlin 中的注释应该如何工作的问题。
首先,我创建了一个名为 AltArg 的注释类:
@Target(AnnotationTarget.PROPERTY)
annotation class AltArg(val name : String)
然后,我注释了我创建的名为 Student 的类的一些属性:
class Student @JvmOverloads constructor (
val name: String,
@AltArg("id") val nr: Int,
@AltArg("birthplace") val from: String,
@AltArg("evaluation") val grades: List<Grade> = emptyList()
)
之后,我创建了一个测试来检查注释是否被识别,但该测试总是失败。调用 Student::class.annotations 不会返回其中的任何注释,因此它的大小始终为零。
@Test fun checkAltArgAnnotationsInStudent() {
val annotations = Student::class.annotations
assertEquals(3, annotations.size)
}
这是我第一次使用注释,我不太明白为什么这不起作用。我错过了一些明显的东西吗?感谢您的帮助!
Student::class.annotations
为您提供了 Student
类的注释,而您却没有。
您在 Student
类 (
@JvmOverloads
) 的 constructor上有一个注释,在 some 属性上有一个注释。
请注意,
@JvmOverloads
具有BINARY
保留,因此它对于这样的反射代码是不可见的。即使使用正确的代码访问构造函数注释,您也不会看到它。
但是,您可以使用
members
访问属性上的注释(因为属性是类的成员):
Student::class.members.forEach { m ->
println("Annotations of member '${m.name}': ${m.annotations}")
}
打印:
Annotations of member 'from': [@AltArg(name="birthplace")]
Annotations of member 'grades': [@AltArg(name="evaluation")]
Annotations of member 'name': []
Annotations of member 'nr': [@AltArg(name="id")]
Annotations of member 'equals': []
Annotations of member 'hashCode': []
Annotations of member 'toString': []