[英]Scala 2.10 reflection: constructor of case class inside a class
我已經使用了這個問題的公認答案來構建一個小的幫助器類,以從值數組構造案例類:從參數集合構造案例類
正如答案中提到的,內部案例類不起作用。 你得到一個
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
異常意味着您需要一個外部引用來構造一個內部類的實例(例如,要構造Y
需要一個Out
的實例)。 然后,您可以執行rm.reflect(instanceOfOut).reflectClass...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.