Java比较同类的对象的不同字段的值

阅读更多
public class UserComparTest {
	
	public static void main(String[] args) {
		new UserComparTest().start();
	}
	
	public void start() {
		User user1 = new User();
		user1.setId("1");
		user1.setName("jacktan");
		user1.setPassword("123");
		User user2 = new User();
		user2.setId("1");
		user2.setName("jj");
		user2.setPassword("222222");
		
		List list = compareDetails(user1, user2);
		System.out.println(list);
	}

	public List compareDetails(Object obj,Object obj2) {
		// 存放新旧对象改变的内容
		List list = new ArrayList();
		// 新的对象
		Object newVersion = obj;
		// 旧的对象
		Object oldVersion = obj2;
		// 需要比较的字段
		String[] opDiffNameArray = { "XX编码", "名称", "密码", "XX目的", "XX范围", "XX使用前", "XX使用过程中", "XX使用过程后", "XX注意事项" };
		// 对应的类中的成员变量
		String[] opDiffArray = { "code", "name", "password", "purpose", "range", "beforeUse", "inUse", "afterUse",
				"notice" };
		contrastObj(newVersion, oldVersion, opDiffArray, opDiffNameArray, list);
		return list;
	}

	public void contrastObj(Object pojo1, Object pojo2, String[] diffMemberArray, String[] diffMemberName,
			List diffList) {
		Map diffMap = new HashMap();
		// map存储中英文对应
		for (int i = 0; i < diffMemberArray.length; i++) {
			diffMap.put(diffMemberArray[i], diffMemberName[i]);
		}
		// 英文List
		List diffMember = Arrays.asList(diffMemberArray);
		
		System.out.println(diffMember);
		System.out.println(diffMap);
		
		try {
			Class clazz = pojo1.getClass();
			// 获取obj1的所有字段
			Field[] fields = pojo1.getClass().getDeclaredFields();
			// 遍历obj1所有字段
			for (Field field : fields) {
				// 如果该字段不再Map中遍历下一个字段
				if (!diffMember.contains(field.getName())) {
					continue;
				}
				// 利用反射获取对应字段的get,set方法
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); // 获取get方法
				Method getMethod = pd.getReadMethod();
				Object o1 = null;
				Object o2 = null;
				if (pojo1 != null) {
					// 调用obj1的对应字段的get方法
					o1 = getMethod.invoke(pojo1);
				}
				if (pojo2 != null) {
					// 调用obj2的对应字段的get方法
					o2 = getMethod.invoke(pojo2);
				}
				String str1 = "";
				String str2 = "";
				// 如果对象是日期类型格式化
				if (o1 instanceof Date) {
					str1 = new SimpleDateFormat("yyyy-MM-dd").format(o1);
					str2 = new SimpleDateFormat("yyyy-MM-dd").format(o2);
				} else if (o1 instanceof String) {
					str1 = (String) o1;
					str2 = (String) o2;
				} else {
					continue;
				}
				// 判断返回的对象不相等
				if ((str1 != null && !str1.equals(str2)) || (str2 != null && !str2.equals(str1))) {
					ChangeInfo change = new ChangeInfo();
//					change.title 
//					// 字段英文名称
//					change.setTitle(field.getName());
					change.title = field.getName();
//					// 中文名称
//					change.setName((String) diffMap.get(field.getName()));
					change.name = (String) diffMap.get(field.getName());
					// 旧信息
//					change.setOldInfo(str2);
					change.oldInfo = str2;
					// 新信息
					change.newInfo = str1;
//					change.setNewInfo(str1);
					diffList.add(change);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 存放不同信息的类
	public class ChangeInfo {

		private static final long serialVersionUID = 1L;

		public String title; // 改变标题 (变量名)
		public String name; // 变更项的名称 (中文名)
		public String type; // 变更显示类型(1:显示content内容 2:
								// 显示前后(oldInfo,newInfo)变更信息)
		public String content; // 提示内容
		public String oldInfo; // 之前内容
		public String newInfo; // 之后内容
		@Override
		public String toString() {
			return "ChangeInfo [title=" + title + ", name=" + name + ", type=" + type + ", content=" + content
					+ ", oldInfo=" + oldInfo + ", newInfo=" + newInfo + "]";
		}
	}
}

 

你可能感兴趣的:(比较同类对象)