java两个对象匹配相同属性不同的值

java两个对象匹配相同属性不同的值


遇到这么一个需求,修改表单的时候要生成一个日记记录修改了哪一个字段数据的值,日记要呈现修改前字段的值和修改后的值,由于表单字段高达一百个,所以不便使用直接获取每个字段的形式去匹配数据,便利用反射获取。

直接上代码:

传入两个对象

    /**** 通过类反射比较两个对象的不同* @param user1* @param user2* @return*/public List<Map<String, String>> getListData(User user1,User user2){Map<String, String> orgobj = new HashMap<String, String>();Map<String, String> nowobj = new HashMap<String, String>();Field[] fs = user1.getClass().getDeclaredFields();for (Field f : fs) {f.setAccessible(true);Object v1 = null;Object v2 = null;try {v1 = f.get(user1);v2 = f.get(user2);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//拿到属性的类型/*String type = f.getGenericType().toString();System.out.println(type);*///if (!f.getType().equals(List.class)) {}// 不匹配list类型if (!equals(v1, v2)) {//两个对象相同属性不相同值的数据加入map中orgobj.put(f.getName(), v1.toString());nowobj.put(f.getName(), v2.toString());}}List<Map<String, String>> list = new ArrayList<Map<String, String>>();list.add(orgobj);//原来的对象属性值list.add(nowobj);//改变的对象属性值return list;}public static boolean equals(Object obj1, Object obj2) {if (obj1 == obj2) {return true;}if (obj1 == null || obj2 == null) {return false;}return obj1.equals(obj2);}

main方法的list中拿到的就是两个对象相同属性的不同值
(User实体类代码省略。。。。)

public static void main(String[] args) {User user1=new User();user1.setCode("321");user1.setUserName("张三");User user2=new User();user2.setCode("123");user2.setUserName("李四");//传入两个不同属性值的对象去做匹配List<Map<String, String>> list = getListData(user1,user2);//判断一个是否长度为空即可,如果两个对象的所有属性值都相同则list为nullif(list.get(0).size()>0){//输出对象user1的属性值System.err.println("user1:"+list.get(0).toString());//输出对象user2的属性值System.err.println("user2:"+list.get(1).toString());}}

输出结果为:

user1:{code=321, userName=张三}
user2:{code=123, userName=李四}