【问题标题】:how to get the annotation of a scala class field [duplicate]如何获取scala类字段的注释[重复]
【发布时间】:2013-02-03 05:28:59
【问题描述】:

可能重复:
How to create annotations and get them in 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])
   })
  }
}

我想测试是否有某个注解,然后分支。 但我不能通过去。我肯定错过了一些基本的东西,但是什么?

【问题讨论】:

  • 1) 问题不在于如何注释类,如如何创建注释并在 scala 中获取它们。 2)我认为,Danyel 的答案越来越近了。但我必须承认,对于像我这样的基本编码人员,我永远不会想到获取注释会如此复杂。据我了解,它们的目的是帮助“getAnnotation”对我有用,但是要诅咒 Universe.type#Annotation,好吧……仍然无法确定版本是否有注释。
  • 你真的读了吗?我链接到的问题解释了为什么它不起作用以及如何通过在 java 中声明注释来修复它,这是 2.10 之前的唯一解决方案,并且可能仍然是许多人在 2.10 中所做的。如果你使用的是java反射,也是only的解决方案。

标签: class scala annotations field


【解决方案1】:

我猜,有了这个 sn-p,你会非常接近你的目标。

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,具体来说,我的 sn-p 中的members 做了什么以及它提供了哪些方法。

问候,
丹尼尔

【讨论】:

  • List.empty[Type] 是表达空的List 值的首选方式。
  • 什么是“宇宙”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2022-09-30
  • 2020-01-20
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多