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 block
e.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为null
if(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=李四}