2011-12-23 12 views

答えて

6

LOL)私の解決策は既に私のlibに実装されていることが分かった。 Scala 2.10が必要です。

def instantiate[T <: AnyRef : Manifest](params: Map[String, Any]): T = { 
    instantiate(Mirror.classToType(manifest[T].erasure), params).asInstanceOf[T] 
    } 
    def instantiate(tpe: Mirror.Type, params: Map[String, Any]) = { 
    val p = constructorParams(tpe, params) 
    require(
     params.size == p.size && 
     p.forall(p => params.contains(p.nameString)), 
     "Params map `" + params + "` doesn't match `" + p + "`" 
    ) 
    Option(Mirror.typeToJavaClass(tpe).getConstructor(p.map(p => Mirror.typeToJavaClass(p.tpe)): _*)) 
     .getOrElse(throw new RuntimeException("No appropriate constructor of `" + tpe + "` found")) 
     .newInstance(p.map(p => params(p.nameString).asInstanceOf[Object]): _*) 
    } 
    private def constructorParams(tpe: Mirror.Type, params: Map[String, Any]) = { 
    tpe.members.find(_.isConstructor).get.paramss(0) 
    } 
+0

Scalaのどのバージョンでうまくいきますか? –

+1

"Scala 2.10が必要です" –

1

パラメータの名前は、バイトコードの一部ではなく、そのための実行時にそこに文字列引数が最初に来るかを知るための手立てがなく、そのため、私は、determistic方法であなたができるとは思いません秒。

関連する問題