工具类 GetChangeDateUtil
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GetChangeDateUtil {
/**
*
* <p>Title: compareFields</p>
* <p>Description: </p> 比较两个实体属性值
* @param obj1
* @param obj2
* @param ignoreArr 忽略的字段
* @return
*/
public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {
try{
Map<String, List<Object>> map = new HashMap<String, List<Object>>();
List<String> ignoreList = null;
if(ignoreArr != null && ignoreArr.length > 0){
// array转化为list
ignoreList = Arrays.asList(ignoreArr);
}
if (obj1.getClass() == obj2.getClass()) {// 只有两个对象都是同一类型的才有可比性
Class clazz = obj1.getClass();
// 获取object的属性描述
PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
Object.class).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {// 这里就是所有的属性了
String name = pd.getName();// 属性名
if(ignoreList != null && ignoreList.contains(name)){// 如果当前属性选择忽略比较,跳到下一次循环
continue;
}
Method readMethod = pd.getReadMethod();// get方法
// 在obj1上调用get方法等同于获得obj1的属性值
Object o1 = readMethod.invoke(obj1);
// 在obj2上调用get方法等同于获得obj2的属性值
Object o2 = readMethod.invoke(obj2);
if(o1 instanceof Timestamp){
o1 = new Date(((Timestamp) o1).getTime());
}
if(o2 instanceof Timestamp){
o2 = new Date(((Timestamp) o2).getTime());
}
if(o1 == null && o2 == null){ //o1 旧 o2新 如果两个都是空就跳过
continue;
}else if(o1 == null && o2 != null){ //如果O1旧的没有 O2新的有
List<Object> list = new ArrayList<Object>();
list.add("旧()");
list.add("新"+"("+MyUtil.deUnicode(String.valueOf(o2))+")");
map.put(name, list);
continue;
}
if (!o1.equals(o2)) {// 比较这两个值是否相等,不等就可以放入map了 //如果旧的和新的不相等
List<Object> list = new ArrayList<Object>();
if(o1==null) {
list.add("旧()");
}else {
list.add("旧"+"("+MyUtil.deUnicode(String.valueOf(o1))+")");
}
if(o2==null) {
list.add("新()");
}else {
list.add("新"+"("+MyUtil.deUnicode(String.valueOf(o2))+")");
}
map.put(name, list);
}
}
}
return map;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
代码引用
String arr[]= {"这里放忽略对比的字段 注意是实体类中的名称"};
System.out.println(GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr));
效果
{person_n1=[旧(), 新(4444)]}
上面只是作为两个实体类的对比,并且最后一并显示出有差别的字段和新旧两个数据
如果想再进一步,如果我想把person_n1的两个值分别拿出来
Map<String, List<Object>> bject = GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr);
List<Object> aa=bject.get("person_n1");
// for (int i = 0; i < aa.size(); i++) {
// System.out.println(aa.get(i));
// }
//用for循环好像没必要了,直接取数据,因为我们只有两个对比值
System.out.println("person_n1由"+aa.get(0)+"修改为"+aa.get(1));
效果
// 旧()
// 新(555)
person_n1由旧()修改为新(4444) //再把工具类中的 旧 和 新 删除
person_n1由()修改为(4444)
如果有多个字段修改了,想生成一段修改记录
System.out.println(GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr));
Map<String, List<Object>> bject = GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr);
List<Map<String,List<Object>>> list = new ArrayList<Map<String, List<Object>>>();
list.add(bject);
for (Map<String,List<Object>> m : list)
{
for (String k : m.keySet())
{
List<Object> aa=bject.get(k);
System.out.println(k+"由"+aa.get(0)+"修改为"+aa.get(1));
}
}
效果
{person_p1=[旧(30), 新(30555)], person_n1=[旧(), 新(4444)]}
person_p1由旧(30)修改为新(30555)
person_n1由旧()修改为新(4444)
最终大家可以自己拼接成字符串,生成修改记录