直接上工具类
/**
* 比较不同对象,指定字段是否相等
*
* @param obj1 对象1
* @param obj2 对象2
* @param fieldNames 需要比较的字段
* @return 比较结果
*/
public static String compareDtoFieldsRes(Object obj1, Object obj2, String... fieldNames) {
if (obj1 == null || obj2 == null) {
return "校验内容为空";
}
for (String fieldName : fieldNames) {
Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
if (!Objects.equals(fieldValue1, fieldValue2)) {
return "字段:" + fieldName + "信息有误";
}
}
return null;
}
/**
* 比较不同对象,指定字段是否相等
*
* @param obj1 对象1
* @param obj2 对象2
* @param fieldNames 需要比较的字段
* @return 比较结果
*/
public static boolean compareDtoFields(Object obj1, Object obj2, String... fieldNames) {
if (obj1 == null || obj2 == null) {
throw new IllegalArgumentException("比较的对象不能为空");
}
for (String fieldName : fieldNames) {
Object fieldValue1 = ReflectUtils.getFieldValue(obj1, fieldName);
Object fieldValue2 = ReflectUtils.getFieldValue(obj2, fieldName);
if (!Objects.equals(fieldValue1, fieldValue2)) {
return false;
}
}
return true;
}
/**
* 比较同对象不同实例,指定字段是否相等
*
* @param obj1 对象1
* @param obj2 对象2
* @param fieldNames 需要比较的字段
* @throws IllegalAccessException
*/
public static boolean compareObjects(Object obj1, Object obj2, List<String> fieldNames) throws IllegalAccessException {
if (obj1 == null || obj2 == null) {
return false;
}
if (!obj1.getClass().equals(obj2.getClass())) {
return false;
}
Class<?> clazz = obj1.getClass();
for (Field field : clazz.getDeclaredFields()) {
if (Modifier.isStatic(field.getModifiers())) {
continue;
}
if (!fieldNames.contains(field.getName())) {
continue;
}
field.setAccessible(true);
Object value1 = field.get(obj1);
Object value2 = field.get(obj2);
if (value1 == null && value2 == null) {
continue;
}
if (value1 == null || value2 == null) {
return false;
}
if (!value1.equals(value2)) {
return false;
}
}
return true;
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
@SuppressWarnings("unchecked")
public static <E> E getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
log.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 ");
return null;
}
E result = null;
try {
result = (E) field.get(obj);
} catch (IllegalAccessException e) {
log.error("不可能抛出的异常{}", e.getMessage());
}
return result;
}