检查两个对象的属性是否相同,可以排除不需要比较的属性
package com.ljq.common.lib.util;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.util.Set;
public class ObjectUtils {
public static boolean checkFieldEquals(Object obj1, Object obj2, Set<String> excludeFields) {
if (obj1 == null || obj2 == null) {
return false;
}
if (!obj1.getClass().equals(obj2.getClass())) {
return false;
}
Field[] fields = obj1.getClass().getDeclaredFields();
for (Field field : fields) {
if (excludeFields != null && (!CollectionUtils.isEmpty(excludeFields)) && excludeFields.contains(field.getName())) {
continue;
}
field.setAccessible(true);
try {
Object value1 = field.get(obj1);
Object value2 = field.get(obj2);
if (value1 == null && value2 == null) {
continue;
}
if (value1 == null || value2 == null) {
return true;
}
if (!value1.equals(value2)) {
return true;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
public static boolean checkNeedFieldEquals(Object obj1, Object obj2, Set<String> excludeFields) {
if (obj1 == null || obj2 == null) {
return false;
}
if (!obj1.getClass().equals(obj2.getClass())) {
return false;
}
Field[] fields = obj1.getClass().getDeclaredFields();
for (Field field : fields) {
if (excludeFields != null && (!CollectionUtils.isEmpty(excludeFields)) && !excludeFields.contains(field.getName())) {
continue;
}
field.setAccessible(true);
try {
Object value1 = field.get(obj1);
Object value2 = field.get(obj2);
if (value1 == null && value2 == null) {
continue;
}
if (value1 == null || value2 == null) {
return true;
}
if (!value1.equals(value2)) {
return true;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
static final ConcurrentHashMap<String, BeanCopier> BEAN_COPIER_MAP = new ConcurrentHashMap<>();
public static <T> T copy(Object source, Class<T> target) {
try {
T instance = target.newInstance();
copy(source, instance, null);
return instance;
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static void copy(Object source, Object target, Converter converter) {
String key = genKey(source.getClass(), target.getClass());
BeanCopier beanCopier;
if (BEAN_COPIER_MAP.containsKey(key)) {
beanCopier = BEAN_COPIER_MAP.get(key);
} else {
beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
BEAN_COPIER_MAP.put(key, beanCopier);
}
beanCopier.copy(source, target, converter);
}
private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
return srcClazz.getName() + tgtClazz.getName();
}
}