java使用反射比较两个bean对象属性值是否相等
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java使用反射比较两个bean对象属性值是否相等相关的知识,希望对你有一定的参考价值。
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; public class DomainEquals { /** * 日志操作类 */ private static Logger logger = Logger.getLogger(DomainEquals.class); public DomainEquals() { } /** * 比较两个BEAN或MAP对象的值是否相等 * 如果是BEAN与MAP对象比较时MAP中的key值应与BEAN的属性值名称相同且字段数目要一致 * @param source * @param target * @return */ public static boolean domainEquals(Object source, Object target) { if (source == null || target == null) { return false; } boolean rv = true; if (source instanceof Map) { rv = mapOfSrc(source, target, rv); } else { rv = classOfSrc(source, target, rv); } logger.info("THE EQUALS RESULT IS " + rv); return rv; } /** * 源目标为MAP类型时 * @param source * @param target * @param rv * @return */ private static boolean mapOfSrc(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 */ private static boolean classOfSrc(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; } /** * 根据字段名称取值 * @param obj * @param fieldName * @return */ public static Object getClassValue(Object obj, String fieldName) { if (obj == null) { return null; } try { Class 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) { logger.info("反射取值出错:" + e.toString()); continue; } if (objValue == null) { continue; } if (ms[i].getName().toUpperCase().equals(fieldName.toUpperCase()) || ms[i].getName().substring(3).toUpperCase().equals(fieldName.toUpperCase())) { return objValue; } else if (fieldName.toUpperCase().equals("SID") && (ms[i].getName().toUpperCase().equals("ID") || ms[i].getName().substring(3).toUpperCase() .equals("ID"))) { return objValue; } } } catch (Exception e) { // logger.info("取方法出错!" + e.toString()); } return null; } public static void main(String args[]) { } }
以上是关于java使用反射比较两个bean对象属性值是否相等的主要内容,如果未能解决你的问题,请参考以下文章
java反射反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更