我知道它基本上是在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())
答案 0 :(得分:3)
按名称(包括val
和object
)从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
中按名称找到它。