注释在 Kotlin 中未按预期工作

问题描述 投票:0回答:1

我有一个关于 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)
}

这是我第一次使用注释,我不太明白为什么这不起作用。我错过了一些明显的东西吗?感谢您的帮助!

java kotlin annotations
1个回答
0
投票

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': []
© www.soinside.com 2019 - 2024. All rights reserved.