2016-02-15 14 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

はScalaでの注釈の異なる種類があります

アノテーションは、JavaのリフレクションAPIを使用してアクセスすることができ、単にソースコード内にある注釈、異なるコンパイル間で型チェッカーに利用できる静的な注釈ユニットはクラスファイルのどこかにあるべきですが、通常のリフレクションが行われない場所に置かれていなければなりません。また、javaアノテーションのように保存されますが、JavaリフレクションAPIを使用して読み取ることはできません。

私はここで、静的およびクラスファイルの注釈にアクセスする方法を説明していますWhat is the (current) state of scala reflection capabilities, especially wrt annotations, as of version 2.11?

あなたがちょうどあなたがシンプルな選択肢かもしれないためにJVMによってロードされたJavaアノテーションを使用して文字列を含む注釈が必要な場合。 Scalaの2.11.6で

2

、これは注釈の値を抽出するために動作します:

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

あなたは、このための輸入を追加することはできますか? –

関連する問題