我有深入遍历案例类的构造函数字段的代码,这些字段本身当然可能很复杂(事物列表、映射、选项和其他案例类)。我发现在运行时提取字段值的代码在最高级别的字段上效果很好,但是当我尝试访问更深的字段时会爆炸。下面的例子。
在现实生活中,我的应用程序会检查每个级别的字段,因此我知道“stuff”是另一个案例类(我有符号/类型),并且我知道 Dos 的字段符号/类型。但这是在运行时获得的,所以我认为它正在爆炸,因为它不知道 [T]/Manifest[T]。有没有办法通过反射在运行时得到这个?我的代码会如何改变?我发现的例子似乎都需要各种各样的东西[T],我不会有'dos',对吧?
case class Uno( name:String, age:Int, pets:List[String], stuff:Dos )
case class Dos( foo:String )
object Boom extends App {
val ru = scala.reflect.runtime.universe
val m = ru.runtimeMirror(getClass.getClassLoader)
val u = Uno("Marcus",19,List("fish","bird"),Dos("wow"))
println("NAME: "+unpack(u,"name")) // Works
println("PETS: "+unpack(u,"pets")) // Works
// ----- Goes Boom -------
val dos = unpack(u,"stuff")
println("Other: "+unpack(dos,"foo")) // Boom!
// -----------------------
// Get object value for named parameter of target
def unpack[T]( target:T, name:String )(implicit man:Manifest[T]) : Any = {
val im = m.reflect(target)
val fieldX = ru.typeOf[T].declaration(ru.newTermName(name)).asTerm.accessed.asTerm
im.reflectField(fieldX).get
}
}