2个相同类型的实体类如何映射

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
* 比较2个相同类型的实体类有哪些字段值不一样,将源实体类不一样的字段
* 值赋给目标实体类
*/
public class CompareBeanUtils {
/**
* @param sourceBean 源类
* @param targetBean 目标类
* @param ignoreArr 需要忽略的熟悉名称
* @return
*/
public static Object compareBean(Object sourceBean, Object targetBean, String[] ignoreArr) {
List<String> ignoreList = null;
if (ignoreArr != null && ignoreArr.length > 0) {
// array转化为list
ignoreList = Arrays.asList(ignoreArr);
}
Class sourceBeanClass = sourceBean.getClass();
Class targetBeanClass = targetBean.getClass();
Field[] sourceFields = sourceBeanClass.getDeclaredFields();
Field[] targetFields = targetBeanClass.getDeclaredFields();
for (int i = 0; i < sourceFields.length; i++) {
Field sourceField = sourceFields[i];
if (Modifier.isStatic(sourceField.getModifiers())) {
continue;
}
Field targetField = targetFields[i];
if (Modifier.isStatic(targetField.getModifiers())) {
continue;
}
sourceField.setAccessible(true);
targetField.setAccessible(true);
try {
if (ignoreList != null && ignoreList.contains(sourceField.getName())) {
continue;
}
if (!(sourceField.get(sourceBean) == null)
&& !"serialVersionUID".equals(sourceField.getName().toString())) {
targetField.set(targetBean, sourceField.get(sourceBean));
}
} catch (Exception e) {
e.printStackTrace();
}
}
return targetBean;
}

public static boolean isModify(Object obj1, Object obj2, String[] ignoreArr) {
boolean flag = false;
try {
List<String> ignoreList = null;
if (ignoreArr != null && ignoreArr.length > 0) {
// array转化为list
ignoreList = Arrays.asList(ignoreArr);
}
if (obj1.getClass() == obj2.getClass()) {
Class clazz = obj1.getClass();
// 获取object的属性描述
PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
Object.class).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();// 属性名
if (ignoreList != null && ignoreList.contains(name)) {// 如果当前属性选择忽略比较,跳到下一次循环
continue;
}
Method readMethod = pd.getReadMethod();// get方法
// 在obj1上调用get方法等同于获得obj1的属性值
Object o1 = readMethod.invoke(obj1);
// 在obj2上调用get方法等同于获得obj2的属性值
Object o2 = readMethod.invoke(obj2);
if (o1 instanceof Timestamp) {
o1 = new Date(((Timestamp) o1).getTime());
}
if (o2 instanceof Timestamp) {
o2 = new Date(((Timestamp) o2).getTime());
}
if (!o1.equals(o2)) {
flag = true;
return flag;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
}


测试用例
public static void main(String[] args) {
Cat sourceCat = new Cat();
sourceCat.setAge(10);
sourceCat.setName("cat");
sourceCat.setHigh(new BigDecimal(20));

Cat targetCat = new Cat();
targetCat.setAge(20);
targetCat.setHigh(new BigDecimal(10));

//targetCat
Cat cat = (Cat) CompareBeanUtils.compareBean(sourceCat, targetCat, new String[]{"high"});
System.out.println(cat);//Cat{name='cat', age=10, high=10}

}
posted @ 2021-08-02 16:30  懂得归零  阅读(530)  评论(0)    收藏  举报