Class 如何获取scala类字段的注释

Class 如何获取scala类字段的注释,class,scala,annotations,field,Class,Scala,Annotations,Field,可能重复: 其他示例获取带注释类的注释。我想做的是获取类字段的注释(本测试中的版本),如下所示: import java.lang.annotation.{RetentionPolicy, Retention} import annotation.meta.field class AttribField() extends scala.annotation.StaticAnnotation object MyTypes { type Attrib = AttribField @field }

可能重复:

其他示例获取带注释类的注释。我想做的是获取类字段的注释(本测试中的版本),如下所示:

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])
   })
  }
}
我想测试是否有某个注释,然后是分支。
但我不能通过。我肯定错过了一些基本的东西,但是什么呢?

我想,通过这段代码,你将非常接近你的目标

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
,特别是我的代码片段中的
成员的作用以及它提供的方法

问候,

Danyel

1)问题不在于如何注释类,而在于如何创建注释并在scala中获取注释。2) 我想,丹耶尔的答案越来越近了。但我必须承认,对于像我这样一个基础的程序员来说,我从来没有想到得到注释会如此复杂。据我所知,它们是用来帮助我的“getAnnotation”,但这会让整个宇宙变得更加疯狂。输入#Annotation,好吧。。。仍然无法确定版本是否有注释。您确实读过吗?我链接到的问题解释了为什么它不起作用,以及如何通过用java声明注释来修复它,java是2.10之前的唯一解决方案,可能仍然是许多人在2.10中所做的。如果您使用的是java反射,它也是唯一的解决方案。
List.empty[Type]
是表示空
List
值的首选方式。“universe”是什么?