3
說我有一個下面的類:從地圖構造函數的參數的創建類的實例值
case class Mock(id: Int, pty1: String, pty2: String)
我如何可以實例從一個動態地圖之後?
val params = Map("id" → 234, "pty1" → "asdf", "pty2" → "asdf")
說我有一個下面的類:從地圖構造函數的參數的創建類的實例值
case class Mock(id: Int, pty1: String, pty2: String)
我如何可以實例從一個動態地圖之後?
val params = Map("id" → 234, "pty1" → "asdf", "pty2" → "asdf")
大聲笑)發現我有一個解決方案已經在我的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)
}
我不認爲你可以在一個determistic方式,因爲參數的名稱不是字節代碼的一部分,併爲此在運行時沒有辦法知道哪些字符串參數自帶第一和第二。
在哪個版本的Scala中起作用? – 2011-12-23 06:04:52
「需要Scala 2.10」 – 2011-12-23 06:35:29