与BeanUtil.copyProperites()区别不需关注source与target属性的类型
/**
* * 1、复制源对象和目标对象的属性值
*
*/
public static void copyProperties(Object source, Object target) {
try {
Class sourceClass = source.getClass();//得到对象的Class
Class targetClass = target.getClass();
//得到Class对象的所有属性,需要注意的是:getFields()只能获取public的字段,包括父类的。而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
Field[] sourceFields = sourceClass.getDeclaredFields();
Field[] targetFields = targetClass.getDeclaredFields();
for (Field sourceField : sourceFields) {
String name = sourceField.getName();//属性名
String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
//得到属性对应get方法
Method getMethodName = sourceClass.getMethod("get" + methodName);
if(getMethodName.invoke(source) != null){
//执行源对象的get方法得到属性值
String value = getMethodName.invoke(source).toString();
for (Field targetField : targetFields) {
String targetName = targetField.getName();//目标对象的属性名
if (targetName.equals(name)) {
Class targetType = targetField.getType();
String typeStr = targetType.getName().toString();
//属性对应的set方法
Method setMethodName = targetClass.getMethod("set" + methodName, targetType);
copyValue(setMethodName, target, value, typeStr);
}
}
}
}
} catch (NoSuchMethodException e) {
log.error("复制对象属性NoSuchMethodException={}",e);
} catch (IllegalAccessException e) {
log.error("复制对象属性IllegalAccessException={}",e);
} catch (InvocationTargetException e) {
log.error("复制对象属性InvocationTargetException={}",e);
}
}
/**
* 执行目标对象的set方法
*
* @param setMethodName
* @param target
* @param value
* @param typeStr
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
private static void copyValue(Method setMethodName, Object target, String value, String typeStr) throws InvocationTargetException, IllegalAccessException {
if (typeStr.contains("Integer")) {
setMethodName.invoke(target, Integer.parseInt(value));
} else if (typeStr.contains("BigDecimal")) {
//保留两位小数
setMethodName.invoke(target, BaseUtil.twoDecimal(value));
} else if (typeStr.contains("String")) {
setMethodName.invoke(target, value);
}
}