簡體   English   中英

Scala 2.10反思:類內case類的構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM