根据对象内部的属性值判断equals public class BaseModel {/** * 判断两个对象当做clazz类型处理比对属性值是否相同,为了处理子类不能访问父类中私有属性 * * @param o1 对象一 * @param o2 对象二
public class BaseModel {
/**
* 判断两个对象当做clazz类型处理比对属性值是否相同,为了处理子类不能访问父类中私有属性
*
* @param o1 对象一
* @param o2 对象二
* @param clazz 父类字节码对象
* @return 判断结果
*/
public static boolean equalsByField(Object o1, Object o2, Class clazz) {
boolean flag;
try {
flag = isSuperTpye(o1, o2, clazz);
if (!flag)
return flag;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method readMethod = pd.getReadMethod();
Object v1 = readMethod.invoke(o1, null);
Object v2 = readMethod.invoke(o2, null);
if (v1 != null || v2 != null)
flag = flag && (v1.equals(v2));
}
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}
/**
* 判断两对象是否相同,根据属性和类型判断
* @param o1
* @param o2
* @return 判断结果
*/
public static boolean equalsByField(Object o1, Object o2) {
boolean flag;
try {
flag = isSameTpye(o1, o2);
if (!flag)
return flag;
Class
clazz = o1.getClass();
for (Class cla = clazz ; !cla.equals(Object.class);
cla=cla.getSuperclass()) {
System.out.println("匹配类型:"+cla);
equalsByField(o1, o2, cla);
}
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}
/**
* 判断两个对象是否类型相同
*
* @param o1 对象一
* @param o2 对象二
* @return 判断结果
*/
public static boolean isSameTpye(Object o1, Object o2) {
Class
class1 = o1.getClass();
boolean flag = class1.isInstance(o2);
return flag;
}
/**
* 判断两个对象是否继承于同一个类
* @param o1 对象一
* @param o2 对象二
* @param clazz 父类
* @return 判断结果
*/
public static boolean isSuperTpye(Object o1, Object o2, Class clazz) {
Class
class1 = o1.getClass();
Class
class2 = o2.getClass();
boolean a;
a = clazz.isAssignableFrom(class1) && clazz.isAssignableFrom(class2);
return a;
}
}
