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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...