我知道如何在Java中获取一个枚举值的注解,但是Kotlin有自己的反射库,我觉得应该有更好的方法来完成这项工作。
具体来说,让我们定义一个枚举类吧。
enum class Enum {
@SerialName("constant")
Constant
}
我需要一个函数 f(e: Enum): String
以致于 f(Enum.Constant) == "constant"
.
我在这里只做了一点研究,但似乎在Kotlin反射库中并不支持这种方式。事实上,我发现linter甚至不能正确地建议注解目标为 FIELD
的注解,如果您给它一个对Enum值不起作用的注解,而是错误地提供自动添加一个目标的 CLASS
.
问题是Enum值基本上是静态成员字段,在Kotlin中除了Enum类之外,其他的都不存在。而反射类似乎没有提供一种方法来访问这种特殊情况。
然而,我很难想到Enum值注释的用例不能使用Enum构造函数中的属性来解决。
enum class MyEnum(val someConstant: String? = null) {
SomeValue("myConstant")
}
你可以在java中使用类似的方法,通过名称获取字段,然后使用annotation类来达到注解的目的。
因此,如果你有下面的Enum和annotation类定义。
enum class Enum {
@SerialName("constant")
Constant
}
annotation class SerialName(val value: String)
那么你可以定义下面的函数,并调用它,如下图所示。
fun getAnnotationValue(enum:Enum):String = enum.declaringClass.getField(enum.name).getAnnotation(SerialName::class.java).value
fun main(args: Array<String>) {
println(getAnnotationValue(Enum.Constant))
}
希望对大家有所帮助。