JAVA⽐较两个实体类的属性变化并⽣成记录⼯具类 GetChangeDateUtil
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import flect.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 (Class() == Class()) {// 只有两个对象都是同⼀类型的才有可⽐性
Class clazz = Class();
// 获取object的属性描述
PropertyDescriptor[] pds = BeanInfo(clazz,
Object.class).getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {// 这⾥就是所有的属性了
String name = pd.getName();// 属性名
if(ignoreList != null && ains(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>();
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(GetChangeDateUtilpareFields(旧的实体类,新的实体类,arr));
效果
{person_n1=[旧(), 新(4444)]}
上⾯只是作为两个实体类的对⽐,并且最后⼀并显⽰出有差别的字段和新旧两个数据
如果想再进⼀步,如果我想把person_n1的两个值分别拿出来
Map<String, List<Object>> bject = GetChangeDateUtilpareFields(旧的实体类,新的实体类,arr); List<Object> ("person_n1");
// for (int i = 0; i < aa.size(); i++) {
// System.out.(i));
// }
//⽤for循环好像没必要了,直接取数据,因为我们只有两个对⽐值
System.out.println("person_n1由"+aa.get(0)+"修改为"+aa.get(1));
效果
// 旧()
// 新(555)
person_n1由旧()修改为新(4444) //再把⼯具类中的旧和新删除
person_n1由()修改为(4444)
如果有多个字段修改了,想⽣成⼀段修改记录java valueof
System.out.println(GetChangeDateUtilpareFields(旧的实体类,新的实体类,arr));
Map<String, List<Object>> bject = GetChangeDateUtilpareFields(旧的实体类,新的实体类,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> (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)
最终⼤家可以⾃⼰拼接成字符串,⽣成修改记录
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论