scala - 如何在运行时使用Scala的反射列出具有自定义注释的所有字段?

标签 scala reflection annotations scala-2.10

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

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

对于给定的类,如何列出具有此批注的所有字段?我正在寻找类似的东西(只是猜测):
def listProperties[T: ClassTag]: List[(SomeClassRepresentingFields,MyProperty)];

最佳答案

这可以通过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方法,如果您需要对它进行一些操作,它可以让您以树的形式访问其参数。

关于scala - 如何在运行时使用Scala的反射列出具有自定义注释的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17792383/

相关文章:

regex - Scala 正则表达式从 url 中提取域

regex - 避免匹配正则表达式中的转义字符

swift - EKEvent的镜像不显示数据

python - 获取 'readable'格式的函数注释

java - Spring Autowiring 问题

generics - Scala - 如何执行 "assertThrows"方法?

scala - 如何从 sbt 命令行为 scalatest 设置系统属性

c# - 从字符串表示访问对象属性

JAVA:将 String 转换为(动态已知的)原始类型以实例化(动态已知的)类

spring-mvc - 在两个 around 函数之间传递对象 - AOP