所以我试图在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?
答案 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