這個工具類有一下四個方法:
1:對比一個對象的屬性和map中的屬性的值是否相等益涧,相等返回true,不相等返回false;
2:對比兩個對象的屬性是否相等箩祥,相等返回true,不相等返回false;
3:對比兩個對象的不同院崇,返回值為map,key為對象中屬性不相等的字段,value為原始對象的值
4:對比兩個對象的不同袍祖,返回值為map,changekey取得修改的字段底瓣,sourceValue取得字段修改前的值,targetValue取得字段修改后的值
測試類:
、蕉陋、捐凭、
package com.test.contrast;
import java.util.HashMap;
import java.util.Map;
public class DomainEqualsTest {
/**
* @Title: main
* @Description: TODO(這里用一句話描述這個方法的作用)
* @param: @param args
* @return: void
* @throws
*/
public static void main(String[] args) {
Person p1 = new Person(1, "name1", 11);
Person p2 = new Person(2, "name2", 11);
Person p3 = new Person(1, "name1", 11);
Map map = new HashMap<>();
map.put("id", 1);
map.put("name", "name1");
map.put("age", 11);
System.out.println("p1和p2屬性是否相等:"+DomainEquals.domainEquals(p1, p2));
System.out.println("p1和p3屬性是否相等:"+DomainEquals.domainEquals(p1, p3));
System.out.println("p1和map屬性是否相等:"+DomainEquals.domainEquals(p1, map));
Map<String, String> map1 = DomainEquals.domainEqualsResult(p1, p2);
System.out.println("map1對比兩個對象的不同,返回值為map,key為對象的字段凳鬓,value為原始對象的值 ");
for (Map.Entry<String, String> entry : map1.entrySet()) {
System.out.println("map1的key:"+entry.getKey());
System.out.println("map1的value:"+entry.getValue());
}
System.out.println("map2對比兩個對象的不同茁肠,返回值為map,changekey取得修改的字段,sourceValue取得字段修改前的值,targetValue取得字段修改后的值");
Map<String, String> map2 = DomainEquals.equalsResultMap(p1, p2);
for (Map.Entry<String, String> entry : map2.entrySet()) {
System.out.println("map2的key:"+entry.getKey());
System.out.println("map2的value:"+entry.getValue());
}
}
}
缩举、蚤蔓、、
測試結果:
p1和p2屬性是否相等:false
p1和p3屬性是否相等:true
p1和map屬性是否相等:true
map1對比兩個對象的不同惊畏,返回值為map,key為對象的字段,value為原始對象的值
map1的key:id
map1的value:1
map1的key:name
map1的value:name1
map2對比兩個對象的不同尊沸,返回值為map,changekey取得修改的字段,sourceValue取得字段修改前的值,targetValue取得字段修改后的值
map2的key:sourceValue
map2的value:1,name1,
map2的key:targetValue
map2的value:2,name2,
map2的key:changekey
map2的value:id,name,
工具類:
、、赦肃、
/**
- @Title: DomainEquals.java
- @Package com.test.contrast
- @Description: 對比兩個對象
- @author A18ccms A18ccms_gmail_com
- @date 2017年6月23日 下午1:35:04
- @version V1.0
*/
package com.test.contrast;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
- @ClassName: DomainEquals
- @Description: 比較兩個對象相同屬性的值是否相等
- @author YQL
- @date 2017年6月23日 下午1:35:04
/
public class DomainEquals {
public static boolean domainEquals(Object source, Object target) {
if (source == null || target == null) {
return false;
}
boolean rv = true;
if (source instanceof Map) {
rv = mapOfSrcIsEqual(source, target, rv);
} else {
rv = classOfSrcIsEqual(source, target, rv);
}
return rv;
}
public static Map<String, String> domainEqualsResult(Object source, Object target) {
if (source == null || target == null) {
return null;
}
Map<String, String> resultMap = classOfSrcResult(source, target);
return resultMap;
}
public static Map<String, String> equalsResultMap(Object source, Object target) {
if (source == null || target == null) {
return null;
}
Map<String, String> resultMap = recAtarResult(source, target);
return resultMap;
}
/*
* 源目標為MAP類型時
* @param source
* @param target
* @param rv
* @return 返回值為是否相等的結果true or false
*/
private static boolean mapOfSrcIsEqual(Object source, Object target, boolean rv) {
HashMap<String, String> map = new HashMap<String, String>();
map = (HashMap) source;
for (String key : map.keySet()) {
if (target instanceof Map) {
HashMap<String, String> tarMap = new HashMap<String, String>();
tarMap = (HashMap) target;
if(tarMap.get(key)==null){
rv = false;
break;
}
if (!map.get(key).equals(tarMap.get(key))) {
rv = false;
break;
}
} else {
String tarValue = getClassValue(target, key) == null ? "" : getClassValue(target, key).toString();
if (!tarValue.equals(map.get(key))) {
rv = false;break;
}
}
}
return rv;
}
/**
* 源目標為非MAP類型時
* @param source
* @param target
* @param rv
* @return 返回值為是否相等的結果true or false
*/
private static boolean classOfSrcIsEqual(Object source, Object target, boolean rv) {
Class<?> srcClass = source.getClass();
Field[] fields = srcClass.getDeclaredFields();
for (Field field : fields) {
String nameKey = field.getName();
if (target instanceof Map) {
HashMap<String, String> tarMap = new HashMap<String, String>();
tarMap = (HashMap) target;
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
if(tarMap.get(nameKey)==null){
rv = false;
break;
}
if (!(String.valueOf(tarMap.get(nameKey))).equals(srcValue)) {
rv = false;
break;
}
} else {
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey).toString();
if (!srcValue.equals(tarValue)) {
rv = false;
break;
}
}
}
return rv;
}
/**
*
* @Title: classOfSrcResult
* @Description: 對比兩個對象的不同,返回值為map,key為對象的字段公浪,value為原始對象的值
* @param: @param source
* @param: @param target
* @param: @return
* @return: Map<String,String>
* @throws
*/
private static Map<String, String> classOfSrcResult(Object source, Object target) {
Map<String, String> resultMap = new HashMap<>();
Class<?> srcClass = source.getClass();
Field[] fields = srcClass.getDeclaredFields();
for (Field field : fields) {
String nameKey = field.getName();
if (target instanceof Map) {
HashMap<String, String> tarMap = new HashMap<String, String>();
tarMap = (HashMap) target;
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
if (tarMap.get(nameKey)==null || !String.valueOf(tarMap.get(nameKey)).equals(srcValue)) {
resultMap.put(nameKey, srcValue);
}
} else {
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey).toString();
if (!srcValue.equals(tarValue)) {
resultMap.put(nameKey, srcValue==null ? "":srcValue);
}
}
}
return resultMap;
}
/**
*
* @Title: recAtarResult
* @Description: 對比兩個對象的不同他宛,返回值為map,changekey取得修改的字段,sourceValue取得字段修改前的值,targetValue取得字段修改后的值
* @param: @param source
* @param: @param target
* @param: @return
* @return: Map<String,String>
* @throws
*/
private static Map<String, String> recAtarResult(Object source, Object target) {
Map<String, String> resultMap = new HashMap<>();
StringBuffer changekey = new StringBuffer("");
StringBuffer sourceValue = new StringBuffer("");
StringBuffer targetValue = new StringBuffer("");
Class<?> srcClass = source.getClass();
Field[] fields = srcClass.getDeclaredFields();
for (Field field : fields) {
String nameKey = field.getName();
if (target instanceof Map) {
HashMap<String, String> tarMap = new HashMap<String, String>();
tarMap = (HashMap) target;
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
String tarValue = String.valueOf(tarMap.get(nameKey));
if (tarMap.get(nameKey)==null || !tarValue.equals(srcValue)) {
changekey.append(nameKey).append(",");
sourceValue.append((srcValue==null||srcValue.equals(""))? " ":srcValue).append(",");
targetValue.append((tarValue==null||"null".equals(tarValue)||tarValue.equals("")) ? " ":tarValue).append(",");
}
} else {
String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey).toString();
String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey).toString();
if (!srcValue.equals(tarValue)) {
changekey.append(nameKey).append(",");
sourceValue.append((srcValue==null||srcValue.equals(""))? " ":srcValue).append(",");
targetValue.append((tarValue==null||tarValue.equals("")) ? " ":tarValue).append(",");
}
}
}
resultMap.put("changekey", changekey.toString());
resultMap.put("sourceValue", sourceValue.toString());
resultMap.put("targetValue", targetValue.toString());
return resultMap;
}
/**
* 根據(jù)字段名稱取值
* @param obj
* @param fieldName
* @return
*/
public static Object getClassValue(Object obj, String fieldName) {
if (obj == null) {
return null;
}
try {
Class<? extends Object> beanClass = obj.getClass();
Method[] ms = beanClass.getMethods();
for (int i = 0; i < ms.length; i++) {
// 非get方法不取
if (!ms[i].getName().startsWith("get")) {
continue;
}
Object objValue = null;
try {
objValue = ms[i].invoke(obj, new Object[] {});
} catch (Exception e) {
continue;
}
if (objValue == null) {
continue;
}
if (ms[i].getName().toUpperCase().equals(fieldName.toUpperCase())
|| ms[i].getName().substring(3).toUpperCase().equals(fieldName.toUpperCase())) {
return objValue;
}
}
} catch (Exception e) {
// logger.info("取方法出錯因悲!" + e.toString());
}
return null;
}
}
堕汞、勺爱、晃琳、
person對象:
、琐鲁、卫旱、
/**
- @Title: Person.java
- @Package com.test.contrast
- @Description: TODO(用一句話描述該文件做什么)
- @author A18ccms A18ccms_gmail_com
- @date 2017年6月23日 上午11:46:12
- @version V1.0
*/
package com.test.contrast;
/**
- @ClassName: Person
- @Description: TODO(這里用一句話描述這個類的作用)
- @author A18ccms a18ccms_gmail_com
- @date 2017年6月23日 上午11:46:12
*/
public class Person {
private int id;
private String name;
private int age;
/**
* @param id
* @param name
* @param age
*/
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
、围段、顾翼、