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

Scala反射更新案例类val

发布时间:2020-12-16 18:12:33 所属栏目:安全 来源:网络整理
导读:我在这里使用 scala和slick,并且我有一个baserepository,负责执行我的类的基本crud. 对于设计决策,我们确实有updateTime和createdTime列全部由应用程序处理,而不是由数据库中的触发器处理.这两个字段都是joda DataTime实例. 这些字段在表中以两个特征(称为Ha
我在这里使用 scala和slick,并且我有一个baserepository,负责执行我的类的基本crud.
对于设计决策,我们确实有updateTime和createdTime列全部由应用程序处理,而不是由数据库中的触发器处理.这两个字段都是joda DataTime实例.
这些字段在表中以两个特征(称为HasUpdatedAt和HasCreatedAt)定义

trait HasCreatedAt {
    val createdAt: Option[DateTime]
}

case class User(name:String,createdAt:Option[DateTime] = None) extends HasCreatedAt

我想知道如何使用反射来调用用户复制方法,以在数据库插入方法期间更新createdAt值.

在@vptron和@ kevin-wright评论之后编辑

我有这样的回购

trait BaseRepo[ID,R] {

    def insert(r: R)(implicit session: Session): ID
  }

我只想实现插入一次,并且我想创建它以进行更新,这就是为什么我没有使用复制方法,否则我需要在使用createdAt列的任何地方实现它.

解决方法

这个问题在这里得到了回答,以帮助其他人解决这类问题.
我最终使用此代码使用scala反射执行我的case类的复制方法.

import reflect._
import scala.reflect.runtime.universe._
import scala.reflect.runtime._

class Empty

val mirror = universe.runtimeMirror(getClass.getClassLoader)
// paramName is the parameter that I want to replacte the value
// paramValue is the new parameter value
def updateParam[R : ClassTag](r: R,paramName: String,paramValue: Any): R = {

  val instanceMirror = mirror.reflect(r)
  val decl = instanceMirror.symbol.asType.toType
  val members = decl.members.map(method => transformMethod(method,paramName,paramValue,instanceMirror)).filter {
    case _: Empty => false
    case _ => true
  }.toArray.reverse

  val copyMethod = decl.declaration(newTermName("copy")).asMethod
  val copyMethodInstance = instanceMirror.reflectMethod(copyMethod)

  copyMethodInstance(members: _*).asInstanceOf[R]
}

def transformMethod(method: Symbol,paramValue: Any,instanceMirror: InstanceMirror) = {
  val term = method.asTerm
  if (term.isAccessor) {
    if (term.name.toString == paramName) {
      paramValue
    } else instanceMirror.reflectField(term).get
  } else new Empty
}

有了这个,我可以执行我的案例类的复制方法,替换确定的字段值.

(编辑:李大同)

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

    推荐文章
      热点阅读