如何访问 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
我有一个案例 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