scala写法----java 对象属性复制到另一个对象中Optional属性及GMT转时间戳

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


点关注,不迷路

文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话 ~求点赞👍 求关注❤️ 求分享❤️ 
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋老湿

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值