2016-02-15 238 views
5

我想在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" 

這甚至可能嗎?

回答

1

有各種不同的註釋在斯卡拉:

Java註解,您可以訪問使用Java反射API,註釋都只是在源代碼中,靜態註釋可用來在不同的編譯類型檢查單元(所以它們應該在類文件中的某個地方,但不能放在正常反射的地方)以及像Java註釋一樣存儲的類文件註釋,但不能使用java反射API讀取。

我描述瞭如何在這裏訪問靜態和類文件註解:What is the (current) state of scala reflection capabilities, especially wrt annotations, as of version 2.11?

如果你只需要包含使用由JVM加載你可能是簡單的選擇一個Java註釋的字符串註釋。

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 
} 
+0

您可以添加進口呢? –