如何在Scala案例类

时间:2017-08-24 02:18:24

标签: scala annotations

所以我试图在Scala案例类中列出具有特定注释的字段,但我无法使其工作......让我们马上看看来代码

案例类(它是它的简化版本,我扩展了另一个类,并且也嵌套在我的测试类中,我只使用它进行单元测试):

case class Foo(@Unique var str: String) {}

自定义Java注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
public @interface Unique {}

我的课程(再次简化)我正在尝试用标记为唯一

的字段做一些事情
class SomeClass[T] (implicit typeTag: TypeTag[T]) {
    val fields: Iterable[universe.TermSymbol] = typeOf(typeTag).members.collect { case s: TermSymbol => s }.
                                                filter(s => s.isVal || s.isVar)
    val list = fields.flatMap(f => f.annotations.find(_.tpe =:= TypeOf[Unique]).((f, _))).toList
}

但最后代码中的val列表始终为空... fields列出了str但没有注释。

我错过了什么?

列出注释的代码来自以下答案: How to list all fields with a custom annotation using Scala's reflection at runtime?

1 个答案:

答案 0 :(得分:1)

似乎参考帖子 Scala 2.10 已旧,与最新的Scala版本不兼容。

有一个示例如何通过类型获取指定注释

  def listProperties[T: TypeTag]: List[universe.Annotation] = {
    typeOf[T].typeSymbol.asClass
      .asClass
      .primaryConstructor
      .typeSignature
      .paramLists.flatten.flatMap(_.annotations)
  }

  val annotations = listProperties[Foo].filter(_.tree.tpe =:= typeOf[Unique])
  println(annotations)

并且有办法获得注释的字段值:

  case class Foo(@Unique(field = "bar") val str: String) {}
  import scala.reflect.runtime.currentMirror
  import scala.tools.reflect.ToolBox

  val tb = currentMirror.mkToolBox()
  val result = tb.eval(tb.untypecheck(head.tree)).asInstanceOf[Unique]

并且需要调用您的注释类是使用 Java 样式实现的,在 Scala 中,您可能希望使用StaticAnnotation来创建Annotation ,像:

  class Unique extends StaticAnnotation