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

scala写法----java 对象属性复制到另一个对象中Optional属性及GM

发布时间:2020-12-16 09:36:17 所属栏目:安全 来源:网络整理
导读:package com.isuwang.soa.activiti.utilimport java.lang.reflect.{Field,Modifier}import java.text.SimpleDateFormatimport java.util.{Locale,Optional}import scala.util.control.Breaks._/** * Created by jiangpeng on 2018/6/25. */object BeanUtils
package com.isuwang.soa.activiti.util

import java.lang.reflect.{Field,Modifier}
import java.text.SimpleDateFormat
import java.util.{Locale,Optional}

import scala.util.control.Breaks._

/**
  * Created by jiangpeng on 2018/6/25.
  */
object BeanUtils {
  /**
    * 对象相同属性copy
    *
    * @param obj
    * @param toResult
    * @return
    * @throws Exception
    * 转换报错
    */
  def copyProperties(obj: Object,toResult: Object): Unit = {
    if (obj == null) {
      return null
    }
    try {
      val fields = toResult.getClass.getDeclaredFields
      for (field <- fields) {
        breakable {
          field.setAccessible(true) //修改访问权限
          if (Modifier.isFinal(field.getModifiers()))
            break
          if (isWrapType(field)) {
            val firstLetter = field.getName().substring(0,1).toUpperCase()
            // 首字母大写
            val getMethodName = "get" + firstLetter + field.getName().substring(1)
            val setMethodName = "set" + firstLetter + field.getName().substring(1)
            val getMethod = {
              try {
                obj.getClass().getMethod(getMethodName)
              } catch {
                case ex: Exception => break
              }
            }

            //从源对象获取get方法
            val setMethod = toResult.getClass.getMethod(setMethodName,field.getType) //从目标对象获取set方法

            //如果get 和 set方法都从一个对象中获取会出现object is not an instance of declaring class这个错误
            //like: User{name} People{name}
            //因为如果从源对象中获取,在setMethod.invoke调用的时候,虽然名字相同,会由于类的不同,导致
            //调用的方法却不是目标对象中应有的方法。实际就是:getMethod = com.package.User.getName()setMethod = com.package.User.setName()
            //而setMethod.invoke调用的结果就变成 People.setName() == People.(com.package.User.setName())
            //这里的setName却不是People该有的,so 报错了
            //同理,如果从目标对象中获取,在getMethod.invoke调用的时候也会出错。
            //因此,对于getMethod和setMethod的获取应该根据源对象和目标对象区别对待。

            val value = {
              val objValue = getMethod.invoke(obj) // get 获取的是源对象的值
              if (objValue != null && objValue.isInstanceOf[java.util.Date]) {
                // GMT时间转时间戳
                val format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.ENGLISH)
                val formatValue = format.format(objValue)
                java.lang.Long.valueOf(format.parse(formatValue).getTime)
              } else
                objValue
            }

            if ("java.util.Optional".equals(field.getType().getName()))
              setMethod.invoke(toResult,Optional.ofNullable(value)) // set 设置的是目标对象的值
            else
              setMethod.invoke(toResult,value)
          }
        }
      }
    } catch {
      case ex: Exception => throw ex
    }
  }

  /**
    * 是否是基本类型、包装类型、String类型
    */
  def isWrapType(field: Field): Boolean = {
    val typeList = List[String]("java.lang.Integer","java.lang.Double","java.lang.Float","java.lang.Long","java.util.Optional","java.lang.Short","java.lang.Byte","java.lang.Boolean","java.lang.Char","java.lang.String","int","double","long","short","byte","boolean","char","float")
    if (typeList.contains(field.getType().getName())) true else false
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读