如何在Scala中使用反射获取所有对象值和子对象值?

科林·迪恩

我有一个看起来像这样的对象:

object Settings {
  final val Host = "host"
  final val Protocol = "protocol"

  object User {
    final val Name = "username"
    final val Password = "password"
  }

  object Subject {
    final val Query = "query"
    final val Predicate = "predicate"
  }
}

我想做的是membersAsHash(classOf[CollectionSettings])对对象中声明的所有val进行类似操作并接收一个哈希值:

[
  Host => "host", 
  Protocol => "protocol", 
  Name => "username",
  Password => "password",
  Query => "query",
  Predicate => "predicate"
]

如果键是字符串,甚至是完整的软件包名称(例如com.example.Settings.User),也可以。我真正需要的是值,所以如果我只能得到它,那还是可以接受的。

这给了我子对象的名称,但是我似乎无法弄清楚如何获取每个子对象内部的val:

val optionsToCheck = {
  import scala.reflect.runtime.{universe => ru}
  val mirror = ru.runtimeMirror(getClass.getClassLoader)
  val subObjects = ru.typeOf[CollectionSettings.type].declarations.filter(_.isModule)
  subobjects.map(o => mirror.reflectModule(o.asModule).instance.asInstanceOf[Object].toString).toList
}
特拉维斯·布朗(Travis Brown)

整洁的是,您正在使用常量值定义(即,没有类型注释的最终值;请参见语言规范的§4.1 ),因此您甚至不需要任何镜像:

def deepMembers[A: scala.reflect.runtime.universe.TypeTag](a: A) = {
  import scala.reflect.runtime.universe._

  def members(s: Symbol): Map[String, String] =
    s.typeSignature.declarations.collect {
      case m: ModuleSymbol => members(m)
      case m: MethodSymbol if m.isAccessor => m.returnType match {
        case ConstantType(Constant(s: String)) => Map(m.name.decoded -> s)
        case _ => Map.empty[String, String]
      }
    }.foldLeft(Map.empty[String, String])(_ ++ _)

  members(typeOf[A].termSymbol)
}

它的工作方式如下:

scala> deepMembers(Settings) foreach println
(Name,username)
(Predicate,predicate)
(Query,query)
(Password,password)
(Protocol,protocol)
(Host,host)

如果由于某种原因不能使用常量值定义,则需要调整MethodSymbol大小写以与实例镜像一起使用,但是从子对象递归收集键值对的基本方法是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中使用反射获取所有对象值和子对象值?

来自分类Dev

如何使用反射和递归获取任何对象的所有名称和值

来自分类Dev

如何使用反射和递归获取任何对象的所有名称和值

来自分类Dev

如何在Rails的ActiveRecord中获取对象的所有值?

来自分类Dev

如何使用javascript从数组对象获取所有值?

来自分类Dev

如何使用ramda获取对象中的所有值

来自分类Dev

如何在运行时使用反射从类的对象获取属性的值

来自分类Dev

如何在C#中使用反射获取方法的所有属性和属性数据

来自分类Dev

使用反射获取对象的所有属性-但仅获取对象为其具有值的属性(不是默认值或null)

来自分类Dev

在Scala中获取所有枚举用例对象的值

来自分类Dev

如何在C#中使用对象ID属性获取对象值

来自分类Dev

如何在C#中使用对象ID属性获取对象值

来自分类Dev

获取Scala中的所有子对象

来自分类Dev

如何从Firebase中的所有子位置获取特定的对象值

来自分类Dev

如何在对象中使用方法返回具有动态值的对象?

来自分类Dev

如何在JavaScript中获取子对象的值

来自分类Dev

如何在角度 6 中获取对象子值

来自分类Dev

如何通过引用的对象获取所有值?

来自分类Dev

如何通过coffeescript获取对象的所有值?

来自分类Dev

如何通过coffeescript获取对象的所有值?

来自分类Dev

C#:如何从JS对象获取键的所有值?

来自分类Dev

如何获取数组内对象的所有值

来自分类Dev

如何获取与数组中的对象关联的所有值?

来自分类Dev

JavaScript:如何获取以特定字符串开头的对象的所有键和值?

来自分类Dev

如何在C#中使用反射从类型和设置属性值中按名称获取属性

来自分类Dev

使用Javascript或JQuery从对象列表中获取所有值

来自分类Dev

使用任何lodash获取嵌套JSON对象的所有值

来自分类Dev

如何在django模型中使用外键获取对象的所有属性

来自分类Dev

mongoDB:获取对象数组的所有值

Related 相关文章

  1. 1

    如何在Scala中使用反射获取所有对象值和子对象值?

  2. 2

    如何使用反射和递归获取任何对象的所有名称和值

  3. 3

    如何使用反射和递归获取任何对象的所有名称和值

  4. 4

    如何在Rails的ActiveRecord中获取对象的所有值?

  5. 5

    如何使用javascript从数组对象获取所有值?

  6. 6

    如何使用ramda获取对象中的所有值

  7. 7

    如何在运行时使用反射从类的对象获取属性的值

  8. 8

    如何在C#中使用反射获取方法的所有属性和属性数据

  9. 9

    使用反射获取对象的所有属性-但仅获取对象为其具有值的属性(不是默认值或null)

  10. 10

    在Scala中获取所有枚举用例对象的值

  11. 11

    如何在C#中使用对象ID属性获取对象值

  12. 12

    如何在C#中使用对象ID属性获取对象值

  13. 13

    获取Scala中的所有子对象

  14. 14

    如何从Firebase中的所有子位置获取特定的对象值

  15. 15

    如何在对象中使用方法返回具有动态值的对象?

  16. 16

    如何在JavaScript中获取子对象的值

  17. 17

    如何在角度 6 中获取对象子值

  18. 18

    如何通过引用的对象获取所有值?

  19. 19

    如何通过coffeescript获取对象的所有值?

  20. 20

    如何通过coffeescript获取对象的所有值?

  21. 21

    C#:如何从JS对象获取键的所有值?

  22. 22

    如何获取数组内对象的所有值

  23. 23

    如何获取与数组中的对象关联的所有值?

  24. 24

    JavaScript:如何获取以特定字符串开头的对象的所有键和值?

  25. 25

    如何在C#中使用反射从类型和设置属性值中按名称获取属性

  26. 26

    使用Javascript或JQuery从对象列表中获取所有值

  27. 27

    使用任何lodash获取嵌套JSON对象的所有值

  28. 28

    如何在django模型中使用外键获取对象的所有属性

  29. 29

    mongoDB:获取对象数组的所有值

热门标签

归档