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