我有一个案例类,我为其中的一些字段添加了一些注释:
final class Anno(min: Int, max: Int) extends StaticAnnotation
case class Test(x: String, @Anno(min = 5, max = 10) y: String)
我想迭代case类的每个字段,获取它的值以及分配给它的case类注释属性(如果存在注释)。
知道如何在Scala中完成它?
答案 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