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 回答