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