参考并优化https://blog.csdn.net/u012756689/article/details/84771123
jdk1.8环境
package com.util;
import com.common.PageCustom;
import org.springframework.data.domain.Page;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @title: DTO与entity互转工具
*/
public class DtoToEntityUtils {
private static final String CLASS_TM = "class java.sql.Timestamp";
private static final String CLASS_DATE = "class java.sql.Date";
private static final String CLASS_STR = "class java.lang.String";
private static final String CLASS_NEU = "class com";
/**
* 将dto和entity之间的属性互相转换
*/
public static Object populate(Object src, Object target) {
Method[] srcMethods = src.getClass().getMethods();
Method[] targetMethods = target.getClass().getMethods();
List<Method> mList = new ArrayList<>();
for (Method m : srcMethods) {
String srcName = m.getName();
if (srcName.startsWith("get")) {
try {
Object result = m.invoke(src);
boolean isExistMutiId = false;
for (Method mm : targetMethods) {
String targetName = mm.getName();
if (targetName.startsWith("set") && targetName.substring(3).equals(srcName.substring(3))) {
isExistMutiId = true;
if (CLASS_TM.equals(m.getGenericReturnType().toString())) {
mm.invoke(target, DateUtils.timeExactToStr((java.sql.Timestamp) result));
} else if (CLASS_DATE.equals(m.getGenericReturnType().toString())) {
mm.invoke(target, DateUtils.timeToStr((java.sql.Date) result));
} else if (CLASS_STR.equals(m.getGenericReturnType().toString())) {
if (CLASS_TM.equals(mm.getParameterTypes()[0].toString())) {
mm.invoke(target, DateUtils.strToTimeExact((String) result));
} else if (CLASS_DATE.equals(mm.getParameterTypes()[0].toString())) {
mm.invoke(target, DateUtils.strToTime((String) result));
} else {
mm.invoke(target, result);
}
} else {
mm.invoke(target, result);
}
}
}
if (!isExistMutiId && m.getGenericReturnType().toString().indexOf(CLASS_NEU) != -1) {
mList.add(m);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
//解决联合主键
for (Method m : mList) {
try {
Object obj = m.invoke(src);
Method[] methods = obj.getClass().getMethods();
for (Method mm : methods) {
String srcNameM1 = mm.getName();
if (srcNameM1.startsWith("get") && !srcNameM1.startsWith("getClass")) {
Object result1 = mm.invoke(obj);
for (Method mm1 : targetMethods) {
String targetName1 = mm1.getName();
if (targetName1.startsWith("set") && targetName1.substring(3).equals(srcNameM1.substring(3))) {
mm1.invoke(target, result1);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return target;
}
/**
* dto集合和实体类集合间的互相属性映射
*/
public static <S, T> List<T> populateList(List<S> srcList, Class<?> targetClass) {
List<T> targetList = new ArrayList<>();
if (srcList == null || srcList.isEmpty()) {
return targetList;
}
Iterator<S> iterator = srcList.iterator();
while (iterator.hasNext()) {
try {
Object object = targetClass.newInstance();
targetList.add((T) object);
populate(iterator.next(), object);
} catch (Exception e) {
continue;// 某个方法反射异常
}
}
return targetList;
}
/**
* dto集合和实体类集合间的互相属性映射
*/
public static <S, T> PageCustom<T> populatePage(Page<S> srcPage, Class<?> targetClass) {
if (srcPage == null) {
return new PageCustom(1, 10);
}
if (srcPage.isEmpty()) {
return new PageCustom(srcPage.getNumber(), srcPage.getSize());
}
List<T> targetList = populateList(srcPage.getContent(), targetClass);
PageCustom targetPage = new PageCustom(srcPage.getNumber(), srcPage.getSize(), srcPage.getTotalElements(),
srcPage.getTotalPages(), targetList);
return targetPage;
}
}