scala – 从构造函数参数值的映射创建类实例
发布时间:2020-12-16 09:05:40 所属栏目:安全 来源:网络整理
导读:说我有以下课程: case class Mock(id: Int,pty1: String,pty2: String) 如何动态地从以下地图中实例化它? val params = Map("id" → 234,"pty1" → "asdf","pty2" → "asdf") 解决方法 LOL)发现我已经在我的lib中实现了一个解决方案.需要Scala 2.10. def i
说我有以下课程:
case class Mock(id: Int,pty1: String,pty2: String) 如何动态地从以下地图中实例化它? val params = Map("id" → 234,"pty1" → "asdf","pty2" → "asdf") 解决方法
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,Any]) = { tpe.members.find(_.isConstructor).get.paramss(0) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容