通过在String中输入对象名来获取Scala对象字段的最佳方法是什么

时间:2013-11-26 02:36:39

标签: scala

我知道它基本上是在2.10中使用最新的scala反射API,或者使用黑客方式在生成的Java类上使用Java反射API。但我搜索过但找不到我需要的正确解决方案,因为我想输入一个表示对象名称的String,然后获取该对象的某个字段值。


此外,我发现以下黑客工作,但它不像使用谢尔盖所建议的纯反射API那样优雅

object Object1 {
    val x: List[Int] = List(1,2,3)
    val y = 2
  }

  val rm = universe.runtimeMirror(getClass.getClassLoader)  
  val module = rm.staticModule("some.package.Object1")  
  val obj = rm.reflectModule(module)
  val im = rm.reflect(obj.instance)

  val f = Class.forName("gretter.Object1$").getDeclaredField("x")
  f.setAccessible(true)
  val x = f.get(obj.instance)
  println(x.toString())

1 个答案:

答案 0 :(得分:3)

按名称(包括valobject)从private打印所有private[this]

        val className = "some.package.SomeObject"

        import scala.reflect.runtime.{universe => ru}
        val mirror = ru.runtimeMirror(getClass.getClassLoader)

        val moduleSymbol = mirror.staticModule(className)
        val moduleMirror = mirror.reflectModule(moduleSymbol)
        val instanceMirror = mirror.reflect(moduleMirror.instance)

        val fields = moduleSymbol.typeSignature.declarations.filter(_.asTerm.isVal)
        for (f <- fields) {
            val fieldMirror = instanceMirror.reflectField(f.asTerm)
            println(s"${f.name}: ${fieldMirror.get}")
        }

如果您需要特定的字段值,可以在fields中按名称找到它。