Scala反射更新案例类val

 戴安娜DianaKok 发布于 2023-01-30 16:26

我在这里使用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列的任何地方实现它.

1 个回答
  • 这个问题在这里得到了回答,以帮助其他人解决这类问题.我最终使用此代码使用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, paramName: String, 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
    }
    

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

    2023-01-30 16:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有