1.直接使用equals方法,如果不重新这个方法默认是两个对象的地址值进行比较相当于==
重新equals方法,可以解决问题
2.如果不行,使用两个对象的toString方法进行比较,当然这个就得两个对象同属于一个类
3.再或者使用
DigestUtils.md5DigestAsHex(obj.toString().getBytes())
进行加密之后比较值是否相同
4.如果实在不行就自己使用反射一个一个比较了,具体代码如下
@Slf4j
public class BeanClassEqualUtils {
/**
*@Description 比较两个对象是否相等
*@Date 14:52 2019/11/28
*@Param [source, target]
*@return boolean
**/
public static boolean classOfSrc(Object source, Object target) {
boolean flag = true;
Class<?> srcClass = source.getClass();
Field[] fields = srcClass.getDeclaredFields();
for (Field field : fields) {
String nameKey = field.getName();
if (target instanceof Map) {
HashMap<String, String> tarMap = new HashMap<String, String>();
tarMap = (HashMap) target;
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
.toString();
if(tarMap.get(nameKey)==null){
flag = false;
break;
}
if (!tarMap.get(nameKey).equals(srcValue)) {
flag = false;
break;
}
} else {
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
.toString();
String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey)
.toString();
log.info("源值字段 {}",srcValue);
log.info("目标字段 {}",tarValue);
if (!srcValue.equals(tarValue)) {
flag = false;
break;
}
}
}
return flag;
}
/**
*@Description 根据字段取值
*@Date 14:53 2019/11/28
*@Param [obj, fieldName]
*@return java.lang.Object
**/
public static Object getClassValue(Object obj, String fieldName) {
if (obj == null) {
return null;
}
try {
Class beanClass = obj.getClass();
Method[] ms = beanClass.getMethods();
for (int i = 0; i < ms.length; i++) {
// 非get方法不取
if (!ms[i].getName().startsWith("get")) {
continue;
}
Object objValue = null;
try {
objValue = ms[i].invoke(obj, new Object[] {});
} catch (Exception e) {
log.info("反射取值出错:" + e.toString());
continue;
}
if (objValue == null) {
continue;
}
if (ms[i].getName().toUpperCase().equals(fieldName.toUpperCase())
|| ms[i].getName().substring(3).toUpperCase().equals(fieldName.toUpperCase())) {
return objValue;
} else if (fieldName.toUpperCase().equals("SID")
&& (ms[i].getName().toUpperCase().equals("ID") || ms[i].getName().substring(3).toUpperCase()
.equals("ID"))) {
return objValue;
}
}
} catch (Exception e) {
log.info("取方法出错!" + e.toString());
}
return null;
}