加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读