加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在运行时使用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方法,如果你需要用它做什么,它可以让你作为树访问它的参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读