【问题标题】:How to list all fields with a custom annotation using Scala's reflection at runtime?如何在运行时使用 Scala 的反射列出所有带有自定义注释的字段?
【发布时间】:2013-07-22 16:09:39
【问题描述】:

我有一个自定义注释,例如

class MyProperty(val name: String)
  extends annotation.StaticAnnotation; // or should I extend something else?

对于给定的类,我如何列出所有具有此注释的字段?我正在寻找类似的东西(只是猜测):

def listProperties[T: ClassTag]: List[(SomeClassRepresentingFields,MyProperty)];

【问题讨论】:

    标签: scala reflection annotations scala-2.10


    【解决方案1】:

    这可以通过TypeTag 来完成,方法是过滤您输入类型的members

    import reflect.runtime.universe._
    
    def listProperties[T: TypeTag]: List[(TermSymbol, Annotation)] = {
      // a field is a Term that is a Var or a Val
      val fields = typeOf[T].members.collect{ case s: TermSymbol => s }.
        filter(s => s.isVal || s.isVar)
    
      // then only keep the ones with a MyProperty annotation
      fields.flatMap(f => f.annotations.find(_.tpe =:= typeOf[MyProperty]).
        map((f, _))).toList
    }
    

    然后:

    scala> class A { @MyProperty("") val a = 1 ; @MyProperty("a") var b = 2 ; 
      var c: Long = 1L }
    defined class A
    
    scala> listProperties[A]
    res15: List[(reflect.runtime.universe.TermSymbol, reflect.runtime.universe.Annotation)]
      = List((variable b,MyProperty("a")), (value a,MyProperty("")))
    

    这不会直接给你MyProperty,而是universe.Annotation。它有一个 scalaArgs 方法,如果你需要对它做一些事情,它可以让你以树的形式访问它的参数。

    【讨论】:

    • 我很适合上课,但不适用于带有自定义注释字段的案例课程。你能帮我调整一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2019-02-22
    • 1970-01-01
    • 2020-07-19
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多