[Java] 使用反射比较两个bean对象属性值是否相等 →→→→→进入此内容的聊天室

来自 , 2021-02-10, 写在 Java, 查看 130 次.
URL http://www.code666.cn/view/43dd49b4
  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. import org.apache.log4j.Logger;
  7.  
  8. public class DomainEquals {
  9.  
  10.     /**
  11.      * 日志操作类
  12.      */
  13.     private static Logger logger = Logger.getLogger(DomainEquals.class);
  14.  
  15.     public DomainEquals() {
  16.     }
  17.  
  18.     /**
  19.      * 比较两个BEAN或MAP对象的值是否相等
  20.      * 如果是BEAN与MAP对象比较时MAP中的key值应与BEAN的属性值名称相同且字段数目要一致
  21.      * @param source
  22.      * @param target
  23.      * @return
  24.      */
  25.     public static boolean domainEquals(Object source, Object target) {
  26.         if (source == null || target == null) {
  27.             return false;
  28.         }
  29.         boolean rv = true;
  30.         if (source instanceof Map) {
  31.             rv = mapOfSrc(source, target, rv);
  32.         } else {
  33.             rv = classOfSrc(source, target, rv);
  34.         }
  35.         logger.info("THE EQUALS RESULT IS " + rv);
  36.         return rv;
  37.     }
  38.  
  39.     /**
  40.      * 源目标为MAP类型时
  41.      * @param source
  42.      * @param target
  43.      * @param rv
  44.      * @return
  45.      */
  46.     private static boolean mapOfSrc(Object source, Object target, boolean rv) {
  47.         HashMap<String, String> map = new HashMap<String, String>();
  48.         map = (HashMap) source;
  49.         for (String key : map.keySet()) {
  50.             if (target instanceof Map) {
  51.                 HashMap<String, String> tarMap = new HashMap<String, String>();
  52.                 tarMap = (HashMap) target;
  53.                 if(tarMap.get(key)==null){
  54.                     rv = false;
  55.                     break;
  56.                 }
  57.                 if (!map.get(key).equals(tarMap.get(key))) {
  58.                     rv = false;
  59.                     break;
  60.                 }
  61.             } else {
  62.                 String tarValue = getClassValue(target, key) == null ? "" : getClassValue(target, key).toString();
  63.                 if (!tarValue.equals(map.get(key))) {
  64.                     rv = false;
  65.                     break;
  66.                 }
  67.             }
  68.         }
  69.         return rv;
  70.     }
  71.  
  72.     /**
  73.      * 源目标为非MAP类型时
  74.      * @param source
  75.      * @param target
  76.      * @param rv
  77.      * @return
  78.      */
  79.     private static boolean classOfSrc(Object source, Object target, boolean rv) {
  80.         Class<?> srcClass = source.getClass();
  81.         Field[] fields = srcClass.getDeclaredFields();
  82.         for (Field field : fields) {
  83.             String nameKey = field.getName();
  84.             if (target instanceof Map) {
  85.                 HashMap<String, String> tarMap = new HashMap<String, String>();
  86.                 tarMap = (HashMap) target;
  87.                 String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
  88.                         .toString();
  89.                 if(tarMap.get(nameKey)==null){
  90.                     rv = false;
  91.                     break;
  92.                 }
  93.                 if (!tarMap.get(nameKey).equals(srcValue)) {
  94.                     rv = false;
  95.                     break;
  96.                 }
  97.             } else {
  98.                 String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
  99.                         .toString();
  100.                 String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey)
  101.                         .toString();
  102.                 if (!srcValue.equals(tarValue)) {
  103.                     rv = false;
  104.                     break;
  105.                 }
  106.             }
  107.         }
  108.         return rv;
  109.     }
  110.  
  111.     /**
  112.      * 根据字段名称取值
  113.      * @param obj
  114.      * @param fieldName
  115.      * @return
  116.      */
  117.     public static Object getClassValue(Object obj, String fieldName) {
  118.         if (obj == null) {
  119.             return null;
  120.         }
  121.         try {
  122.             Class beanClass = obj.getClass();
  123.             Method[] ms = beanClass.getMethods();
  124.             for (int i = 0; i < ms.length; i++) {
  125.                 // 非get方法不取
  126.                 if (!ms[i].getName().startsWith("get")) {
  127.                     continue;
  128.                 }
  129.                 Object objValue = null;
  130.                 try {
  131.                     objValue = ms[i].invoke(obj, new Object[] {});
  132.                 } catch (Exception e) {
  133.                      logger.info("反射取值出错:" + e.toString());
  134.                     continue;
  135.                 }
  136.                 if (objValue == null) {
  137.                     continue;
  138.                 }
  139.                 if (ms[i].getName().toUpperCase().equals(fieldName.toUpperCase())
  140.                         || ms[i].getName().substring(3).toUpperCase().equals(fieldName.toUpperCase())) {
  141.                     return objValue;
  142.                 } else if (fieldName.toUpperCase().equals("SID")
  143.                         && (ms[i].getName().toUpperCase().equals("ID") || ms[i].getName().substring(3).toUpperCase()
  144.                                 .equals("ID"))) {
  145.                     return objValue;
  146.                 }
  147.             }
  148.         } catch (Exception e) {
  149.             // logger.info("取方法出错!" + e.toString());
  150.         }
  151.         return null;
  152.     }
  153.  
  154.     public static void main(String args[]) {
  155.     }
  156.  
  157. }
  158.  
  159. //源代码片段来自云代码http://yuncode.net
  160.                        

回复 "使用反射比较两个bean对象属性值是否相等"

这儿你可以回复上面这条便签

captcha