java⽐较两个实体对象的值差异
import com.alibaba.fastjson.JSONObject;
import org.apachemons.beanutils.PropertyUtils;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import flect.InvocationTargetException;
import flect.Method;
import java.sql.Timestamp;
import java.util.*;
/**
* ⽐较对象属性是否发⽣变化
*/
public class CompareFieldUtils {
/**
* ⽐较两个不同实体属性值
* @param sourceObj 原对象
* @param currentObj 当前对象
* @param compareArr 需要⽐较的字段
* @return
*/
public static Map<String, Object> compareFields(Object sourceObj, Object currentObj, String[] compareArr, String[] ignoreArr) { try{
Map<String, Object> map = new HashMap<String, Object>();
Map<String, Object> oldValueMap = new HashMap<String, Object>();
List<String> compareList = (compareArr == null || compareArr.length == 0)?null:Arrays.asList(compareArr);
List<String> ignoreList = (ignoreArr == null || ignoreArr.length == 0)?null:Arrays.asList(ignoreArr);
Class clazz = Class();
Class clazz_current = Class();
// 获取object的属性描述
PropertyDescriptor[] pds = BeanInfo(clazz, Object.class).getPropertyDescriptors();
BeanInfo current_bean = BeanInfo(clazz_current, Object.class);
for (PropertyDescriptor pd : pds) {// 这⾥就是所有的属性了
object toString name = pd.getName();// 属性名
//⽐较字段不为空,且当前字段不在⽐较的范围内
if(compareList != null && !ains(name)){
continue;
}
//忽略字段不为空,且当前字段在忽略的范围内
if(ignoreList != null && ains(name)){
continue;
}
Method readMethod = pd.getReadMethod();// get⽅法
// 在sourceObj上调⽤get⽅法等同于获得sourceObj的属性值
Object o1 = readMethod.invoke(sourceObj);
/
/ 在currentObj上调⽤get⽅法等同于获得currentObj的属性值
Method readMethod_current = Method("get"+ name.substring(0,1).toUpperCase() + name.substring(1)); Object o2 = readMethod_current.invoke(currentObj);
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){
continue;
}else if(o1 == null && o2 != null){
map.put(name, o2);
oldValueMap.put(name, 01);
oldValueMap.put(name, 01);
continue;
}
if (!o1.equals(o2)) {// ⽐较这两个值是否相等,不等就可以放⼊map
map.put(name, o2);
oldValueMap.put(name, 01);
}
}
//将原始值记录起来,⽅便可查看差异,可按需去掉
if(!oldValueMap.isEmpty()) {
map.put("oldValueMap", JSONString(oldValueMap));
}
return map;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* 按指定的属性列表赋值对象
*
* @param source 原数据对象
* @param target ⽬标对象
* @param changeMap
*
*/
public static void copyWithProperties(Object source, Object target, Map<String, Object> changeMap) throws IllegalAccessException, NoSuchMethodException, for (String property : changeMap.keySet()) {
PropertyUtils.setProperty(target, property, Property(source, property));
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论