如何访问案例类字段注释值

时间:2017-04-28 00:37:13

标签: scala reflection annotations case-class

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

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

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

我想迭代case类的每个字段,获取它的值以及分配给它的case类注释属性(如果存在注释)。

知道如何在Scala中完成它?

1 个答案:

答案 0 :(得分:1)

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

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

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

或者,您可以在案例类中注释注释,如此

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