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
  }
}
相关文章
相关标签/搜索