如何在运行时使用Scala的反射列出带有自定义注释的所有字段?
发布时间:2020-12-16 19:00:13 所属栏目:安全 来源:网络整理
导读:我有一个自定义注释 class MyProperty(val name: String) extends annotation.StaticAnnotation; // or should I extend something else? 对于给定的类,如何列出具有此批注的所有字段?我正在寻找像(只是猜测)的东西: def listProperties[T: ClassTag]: Lis
我有一个自定义注释
class MyProperty(val name: String) extends annotation.StaticAnnotation; // or should I extend something else? 对于给定的类,如何列出具有此批注的所有字段?我正在寻找像(只是猜测)的东西: def listProperties[T: ClassTag]: List[(SomeClassRepresentingFields,MyProperty)]; 解决方法
这可以通过TypeTag完成,通过筛选输入类型的成员:
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方法,如果你需要用它做什么,它可以让你作为树访问它的参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |