如何在Scala中定义和使用自定义注释

时间:2016-02-15 22:34:01

标签: scala

我正在尝试在Scala中使用自定义注释。在这个例子中,我创建了一个我想用元数据注释的字符串(在本例中是另一个字符串)。然后,给定一个数据实例,我想阅读注释。

scala> case class named(name: String) extends scala.annotation.StaticAnnotation
defined class named

scala> @named("Greeting") val v = "Hello"
v: String = Hello

scala> def valueToName(x: String): String = ???
valueToName: (x: String)String

scala> valueToName(v) // returns "Greeting" 

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

使用scala 2.11.6,这可以提取注释的值:

case class Named(name: String) extends scala.annotation.StaticAnnotation

val myAnnotatedClass: ClassSymbol = u.runtimeMirror(Thread.currentThread().getContextClassLoader).staticClass("MyAnnotatedClass")
val annotation: Option[Annotation] = myAnnotatedClass.annotations.find(_.tree.tpe =:= u.typeOf[Named])
val result = annotation.flatMap { a =>
  a.tree.children.tail.collect({ case Literal(Constant(name: String)) => doSomething(name) }).headOption
}

答案 1 :(得分:1)

Scala中有不同类型的注释:

您可以使用Java Reflection API访问的Java注释,源代码中的注释,不同编译单元中类型检查器可用的静态注释(因此它们应该位于类文件中的某个位置但不在哪里正常反射go)和类文件注释,它们像java注释一样存储,但不能使用java反射api读取。

我在此处描述了如何访问静态和类文件注释:What is the (current) state of scala reflection capabilities, especially wrt annotations, as of version 2.11?

如果您只需要使用由JVM加载的Java注释包含字符串的注释,则可能是更简单的替代方法。