比较两个对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/woshimuyi1025/article/details/74172006
/**   
* @Title: DomainEquals.java 
* @Package com.test.contrast 
* @Description: TODO(用一句话描述该文件做什么) 
* @author A18ccms A18ccms_gmail_com   
* @date 2017年6月23日 下午1:35:04 
* @version V1.0   
*/ 
package com.txt.workbench.common.utils;

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;
	}
	/**
     * 源目标为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 (!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;
		}
	
	/**
     * 根据字段名称取值
     * @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;
	}
}

猜你喜欢

转载自blog.csdn.net/woshimuyi1025/article/details/74172006
今日推荐