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

Scala 如何访问案例类字段注释值,scala,reflection,annotations,case-class,Scala,Reflection,Annotations,Case Class,我有一个case类,我在其中的一些字段中添加了一些注释: final class Anno(min: Int, max: Int) extends StaticAnnotation case class Test(x: String, @Anno(min = 5, max = 10) y: String) 我想迭代case类的每个字段,获取其值和分配给它的case类注释属性(如果注释存在) 您知道如何在Scala中实现吗?要获得您可以使用的case类构造函数的注释列表: import sca

我有一个case类,我在其中的一些字段中添加了一些注释:

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

case class Test(x: String, @Anno(min = 5, max = 10) y: String)
我想迭代case类的每个字段,获取其值和分配给它的case类注释属性(如果注释存在)


您知道如何在Scala中实现吗?

要获得您可以使用的case类构造函数的注释列表:

import scala.reflect.runtime.universe._
symbolOf[Test].asClass.primaryConstructor.typeSignature.paramLists.head.map(s => (s -> s.annotations))
但是,参数列表中的注释不会自动添加到相应的类成员中。因此,您必须按名称将通过上述调用获得的带注释的参数
y
与生成的字段
y
相匹配

或者,您可以在case类中对注释进行如下注释

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]))

你会在这篇文章中找到大部分答案:谢谢。我已经看过了。没帮上多少忙。。。返回了一个空列表。我已经有了一个获取注释列表的解决方案,但是没有参考原始的case类参数,而且我也不知道一旦我有了注释类,如何访问注释属性。试图用泛型T替换Test,我得到了以下异常:scala.ScalaReflectionException:free type T不是一个类。有没有办法解决这个问题?第一个解决方案似乎是正确地获得注释的地图。我目前正在迭代case类,并使用类似以下内容将其转换为字符串:testCaseClass.productIterator.map(u.tostring.mkString(“,|”,“”)。我可以访问第一个解决方案的映射,有没有迭代case类的方法?非常感谢您的帮助。顶级解决方案看起来不错,我基本上有两个问题:1)如何访问注释信息?2) 如何使用泛型T而不是Test来编写相同的代码?如果您使用
[T:TypeTag]
声明类型参数,您的方法将获得一个隐式参数,您可以在itIt编译中使用
typeOf[T]
,但返回一个空结果。我尝试类似的方法:def extractAnnotations[T:TypeTag]:Unit={val allAnnotations=typeOf[T].typeSymbol.asClass.primaryConstructor.typeSignature.paramLists.head.map(.annotations)}。当我将其从方法中取出并直接输入case类时,它似乎可以工作:typeOf[TestCaseClass].typeSymbol.asClass.primaryConstructor.typeSignature.ParamList.head.map(.annotations)。有办法解决吗?
val yField = it.iterator.next
val o = Test("123", "abc")
universe.runtimeMirror(o.getClass.getClassLoader).reflect(o)
  .reflectField(yField.asTerm).get