该方法不需要引入任何外部jar包,仅基于JDK反射处理复制对象,性能良好,有问题可私信邮箱(1982580674@qq.com),有问题大家一起讨论学习,转载请写明出处©
注意:切记属性名要一致,属性get/set方法需一致方法名!!!
package com.alone.myproject.common.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Description: [复制不同实体相同属性值]</p>
* Created on 2019年08月20日
* @author <a href="mailto: 1982580674@qq.com">恋雨烟梦</a>
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
*/
public abstract class BeanUtil {
/**
* Description: [复制单个对象]
* @param objSource 源对象
* @param clazz 目标class
* @return: T 目标对象
* Created on 2019年08月20日
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
**/
public static <T> T copyProperties(Object objSource, Class<T> clazz) {
if (objSource == null) return null;
try {
T objDes = clazz.newInstance();
Field[] fields = objSource.getClass().getDeclaredFields();
Field[] fieldsSup = objSource.getClass().getSuperclass().getDeclaredFields();
Method[] method = clazz.getMethods();
if (null != fields) {
assignment(objSource, clazz, objDes, fields, method);
}
if (null != fieldsSup) {
assignment(objSource, clazz, objDes, fieldsSup, method);
}
return objDes;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Description: [复制批量对象]
* @param objSourceList 源对象-list装载
* @param clazz 目标class
* @return: List<T> 目标对象-list装载
* Created on 2019年08月20日
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
**/
public static <T, E> List<T> copyList(List<E> objSourceList, Class<T> clazz) {
if (null == objSourceList) return null;
List<T> target = new ArrayList<T>();
for (E souece : objSourceList) {
target.add(copyProperties(souece, clazz));
}
return target;
}
/**
* Description: [属性赋值]
* @param objSource 源
* @param clazz 目标class
* @param objDes 目标
* @param fields 属性
* @param method 方法
* @return: void
* Created on 2019年08月20日
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
**/
private static <T> void assignment (Object objSource, Class clazz, T objDes, Field[] fields, Method[] method) {
try {
for (Field field : fields) {
field.setAccessible(true);
if (checkMethod(method, field.getName())) {
String setMethodName = "set" + caseInitials(field.getName());
Method setMethod = clazz.getMethod(setMethodName, new Class[]{field.getType()});
setMethod.invoke(objDes, field.get(objSource));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Description: [校验目标是否有set方法-全名称匹配]
* @param method 目标方法
* @param attribute 属性名称
* @return: boolean false-未包含有set方法
* Created on 2019年08月20日
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
**/
private static boolean checkMethod(Method[] method, String attribute){
if (null == method || null == attribute) return false;
for (Method md : method) {
String methodName = md.getName();
String attributeMethod = "set" + caseInitials(attribute);
if (methodName.equals(attributeMethod)) return true;
}
return false;
}
/**
* Description: [首字母变大写]
* @param attribute 目标字符串
* @return: java.lang.String 处理字符串
* Created on 2019年08月20日
* @version 1.0
* Copyright (c) 2019 恋雨烟梦©
**/
private static String caseInitials(String attribute){
if (null == attribute) return null;
char[] cs = attribute.toCharArray();
cs[0] -= 32;
return String.valueOf(cs);
}
}