2

重複の可能性:
注釈を作成して scala で取得する方法

他の例では、注釈付きクラスの注釈を取得します。私がやりたいことは、次のようなクラス フィールド (このテストではバージョン) の注釈を取得することです。

import java.lang.annotation.{RetentionPolicy, Retention}
import annotation.meta.field

class AttribField() extends scala.annotation.StaticAnnotation
object MyTypes { type Attrib = AttribField @field }
import MyTypes._
case class TestClass(@Retention(RetentionPolicy.RUNTIME) 
                     @Attrib version: Option[String])
object TestMe {
  def main(args: Array[String]) {
    val testObj = new TestClass(version = Some("1"))
    testObj.getClass.getDeclaredFields.foreach(field => {
  field.setAccessible(true)
  println("field: name=" + field.getName + " value=" + field.get(testObj))
  field.getAnnotations.foreach(x => println("x="+x))  // nothing in here
  field.getDeclaredAnnotations.foreach(x => println("y="+x))  // nothing in here
  // does not even compile
//     field.getAnnotation(classOf[AttribField])
   })
  }
}

特定の注釈があるかどうかをテストしてから、分岐します。しかし、私は行くことができません。私が見逃した基本的な何かがあるに違いありませんが、何ですか?

4

1 に答える 1

1

このスニペットを使用すると、目標に非常に近づくことができると思います。

import scala.reflect.runtime.universe
def annotationsOf[T: universe.TypeTag](obj: T) = {
    universe.typeOf[T].members.foldLeft(Nil: List[universe.type#Annotation]) {
        (xs, x) => x.annotations ::: xs
    }
}

この例では、次のように呼び出します。

val testObj = TestClass(version = Some("1"))
println(annotationsOf(testObj))

詳細を知りたい場合はTypeTag、具体的にはmembers、私のスニペットで何が行われ、どのメソッドが提供されるかを調べてください。

よろしく、
ダニエル

于 2013-02-03T10:20:10.027 に答える