当前位置 : 主页 > 编程语言 > java >

根据对象内部的属性值判断equals

来源:互联网 收集:自由互联 发布时间:2021-06-28
根据对象内部的属性值判断equals public class BaseModel {/** * 判断两个对象当做clazz类型处理比对属性值是否相同,为了处理子类不能访问父类中私有属性 * * @param o1 对象一 * @param o2 对象二
根据对象内部的属性值判断equals
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;
	}
}
网友评论