如何访问 case class 字段注释值

How to access case class field annotation values

我有一个案例 class,我为其中的一些字段添加了一些注释:

final class Anno(min: Int, max: Int) extends StaticAnnotation

case class Test(x: String, @Anno(min = 5, max = 10) y: String)

我想迭代案例 class 的每个字段,获取它的值和分配给它的案例 class 注释属性(如果注释存在)。

知道如何在 Scala 中完成它吗?

要获取案例 class 的构造函数的注释列表,您可以使用:

import scala.reflect.runtime.universe._
symbolOf[Test].asClass.primaryConstructor.typeSignature.paramLists.head.map(s => (s -> s.annotations))

但是参数列表中的注解不会自动添加到对应的class成员中。因此,您必须将通过上述调用获得的注释参数 y 按名称匹配到生成的字段 y

或者,您可以像这样class在您的案例中注释注释

import scala.annotation.meta._
case class Test(x: String, @(Anno @field)(min = 5, max = 10) y: String)

然后使用

val it = symbolOf[Test].toType.members
  .filter(_.annotations.exists(a => a.tree.tpe <:< typeOf[Anno]))

获取带有 Anno 注释的字段的可迭代对象。 对于找到的字段和 Test 的实例,您将获得如下值

val yField = it.iterator.next
val o = Test("123", "abc")
universe.runtimeMirror(o.getClass.getClassLoader).reflect(o)
  .reflectField(yField.asTerm).get