美文网首页Scala
Scala case class 动态copy

Scala case class 动态copy

作者: 大猪大猪 | 来源:发表于2019-08-25 15:00 被阅读0次

在scala中、case class 确实好用、但是只支持指定字段名称使用copy复制、在动态情场中、一个类的字段可是非常多的、如何处理这样的问题?这就得使用到反射功能了、下面已经给大家写好了。

CopyUtil.scala

import java.lang.reflect.Modifier

object CopyUtil {

  def copy[T](o: T, vals: (String, Any)*): T = {
    if(vals.isEmpty) return o
    val copier = new Copier(o.getClass)
    val maps = vals.map(kv => {
      kv._1 -> kv._2
    }).toMap
    copier(o, maps)
  }

  def copy[T](o: T, vals: Map[String, Any]): T = {
    if(vals.isEmpty) return o
    val copier = new Copier(o.getClass)
    copier(o, vals)
  }

  private class Copier(cls: Class[_]) {
    private val ctor = cls.getConstructors.apply(0)
    private val getters = cls.getDeclaredFields
      .filter {
        f =>
          val m = f.getModifiers
          Modifier.isPrivate(m) && Modifier.isFinal(m) && !Modifier.isStatic(m)
      }
      .take(ctor.getParameterTypes.length)
      .map(f => cls.getMethod(f.getName))

    def apply[T](o: T, vals: Map[String, Any]): T = {
      val byIx = vals.map {
        case (name, value) =>
          val ix = getters.indexWhere(_.getName == name)
          if (ix < 0) throw new IllegalArgumentException("Unknown field: " + name)
          (ix, value.asInstanceOf[Object])
      }.toMap

      val args = getters.indices.map {
        i =>
          byIx.getOrElse(i, getters(i).invoke(o))
      }
      ctor.newInstance(args: _*).asInstanceOf[T]
    }

  }

}

使用

case class User(username:String,password:String)
val user = User("lake","admin")
CopyUtil.copy(user,Map("username"->"admin"))

相关文章

  • Scala case class 动态copy

    在scala中、case class 确实好用、但是只支持指定字段名称使用copy复制、在动态情场中、一个类的字段...

  • case class

    Case Classes Scala 支持 case classes 记法。Case Class 就是普通的类, ...

  • scala case class

    当一个类被定为case class 时,scala会默认做如下工作: (1)如果参数不加var/val修改,默认为...

  • Scala case class学习

    case class介绍 样例类(case class)适合用于不可变的数据。它是一种特殊的类,能够被优化以用于模...

  • scala学习笔记-case class

    伴生对象 当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象 scala类里面没有静态方法和静态字段...

  • Scala 关于样例类的优点

    case class在匹配模式和actor中经常使用到,当一个类被定义成为case类后,Scala会自动帮你创建一...

  • Scala 中的 case class 和 pattern ma

    摘要 本文将详细介绍 Scala 中两个非常重要的概念 case class 和 pattern matching...

  • Java & Groovy & Scala & Kotlin -

    Overview 样本类是 Scala 中使用关键字 case class 声明的类。它可以隐式调用构造方法进行初...

  • scala 模式匹配

    scala的模式匹配与java的switch case相似,但是switch case只能对值进行判断,scala...

  • scala备忘(三)

    一、函数当做参数 二、惰性赋值 三、协变、逆变样例 四、for表达式中的模式 五、case class copy ...

网友评论

    本文标题:Scala case class 动态copy

    本文链接:https://www.haomeiwen.com/subject/anghectx.html