根据对象内部的属性值判断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; } }