2

我已经使用这个问题的公认答案来构建小助手类来从值数组 构造案例类:从参数集合构造案例类

如答案中所述,内部案例类不起作用。你得到一个

ScalaReflectionException: class X is an inner class, use reflectClass on an InstanceMirror to obtain its ClassMirror  

正如异常所解释的那样,我无法弄清楚如何使用 InstanceMirror。这是我当前的可 REPL 代码(由于缓存,比需要的稍微复杂一些)。

import scala.reflect.runtime.universe._ 

object ReflectUtil {
  private val constructorCache = collection.mutable.HashMap[String, MethodMirror]()

  def constructFromSeq[T: TypeTag](args: Seq[Any]): T = {
    val tag = typeTag[T]
    val strTag = tag.toString
    var constructorMirror = constructorCache.getOrElseUpdate( strTag, {
      val rm = runtimeMirror(getClass.getClassLoader)
      val classSymbol = tag.tpe.typeSymbol.asClass
      val classMirror = rm.reflectClass(classSymbol) // wrap with try/catch?
      val constructorSymbol = tag.tpe.declaration(nme.CONSTRUCTOR).asMethod
      classMirror.reflectConstructor(constructorSymbol)
    })
    constructorMirror(args: _*).asInstanceOf[T]
  } 
}   

case class X(a:String, b:Int)

class Out { 
  case class Y(a:String, b:Int) 

  def buildY(arr:Array[Any]) = {
    ReflectUtil.constructFromSeq[Y](arr)
  }
}

val arr = Array[Any]("asdf", 1234)
ReflectUtil.constructFromSeq[X](arr) // this works

val inst = new Out
inst.buildY(arr) // this doesn't work
4

1 回答 1

4

例外意味着您需要外部引用来构造内部类的实例(例如,构造Y您需要 的实例Out)。那你就可以了rm.reflect(instanceOfOut).reflectClass...

于 2013-02-24T19:08:45.027 回答