我正在尝试在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"
这甚至可能吗?
答案 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注释包含字符串的注释,则可能是更简单的替代方法。