由于工作需要,写了个比较两个对象是否相同的类,即对象的属性值是否相同,属性值通过getXxx()、isXxx()方法得到,如属性无get、is方法,则该属性会被过滤掉,属性不包括list,map等容器类。

    原理是利用set的唯一性验证两个对象的同一个属性值是否相同。若相同,continue;不同,break。若属性是自定义数组,则递归该数组。

    另,本代码是jdk1.4的,jdk1.5需要改动下面红色的部分,将null参数去掉即可。

 

package test;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;

/**
 * <li>Title: Test.java</li>
 * <li>Project: Test</li>
 * <li>Package: test</li>
 * <li>Description: </li>
 * <li>Copyright: Copyright (c) 2009</li>
 * <li>Company: IdealTechnologies </li>
 * <li>Created on May 8, 2009 12:48:17 PM</li>
 *
 * @author chun_chang
 * @version 1.0
 */
public class Test {

 private static Set set = new HashSet();

 public static void main(String[] args) {
  A a = new A();
  A b = new A("2", 1);
  if (compare(a, b)) {
   System.out.println(a + " and " + b + " are same ...");
  } else {
   System.out.println(a + " and " + b + " are different ...");
  }
 }

/**
  * @param obj1
  * @param obj2
  * @return false different,true same
  * @CreateOn May 8, 2009 2:53:27 PM
  * @author chun_chang
  */
 public static boolean compare(Object obj1, Object obj2) {
  boolean isSame = false;
  boolean isPrimitive = false;
  try {
   Map map1 = getGetMethod(obj1);
   Map map2 = getGetMethod(obj2);
   Iterator iter = map1.keySet().iterator();
   while (iter.hasNext()) {
    String key = (String) iter.next();
    Object[] o1 = (Object[]) map1.get(key);
    Object[] o2 = (Object[]) map2.get(key);

    isPrimitive = ((Class) o1[1]).isPrimitive();
    if (isPrimitive) {
     set.add(o1[0]);
     isSame = !set.add(o2[0]);
     if (set.size() != 1) {
      System.out.println("the method '" + key + "()' is different ...");
      set.clear();
      break;
     } else {
      set.clear();
     }
    } else {
     Class c = (Class) o1[1];
     String objClass = c.toString().split(" ")[1];
     if (objClass.startsWith("java.")) {
      set.add(o1[0]);
      isSame = !set.add(o2[0]);
      if (set.size() != 1) {
       System.out.println("the method '" + key + "()' is different ...");
       set.clear();
       break;
      } else {
       set.clear();
      }
     } else if (c.isArray()) {// String array
      if ("[Ljava.lang.String;".equals(objClass)) {
       if (o1[0] != null && o2[0] != null) {
        for (int k = 0; k < ((String[]) o1[0]).length; k++) {
         if (((String[]) o1[0])[k] != ((String[]) o2[0])[k]) {
          isSame = false;
          System.out.println("the method '" + key + "()' is different ...");
          break;
         }
        }
       } else if (o1[0] == null && o2[0] == null) {
        isSame = true;
        continue;
       } else {
        System.out.println("the method '" + key + "()' is different ...");
        isSame = false;
        continue;
       }
      } else if (objClass.length() == 2) {// base array
       char ch = objClass.charAt(1);
       switch (ch) {
       case 'Z':// boolean
        for (int k = 0; k < o1.length; k++) {
         if (((boolean[]) o1[0])[k] != ((boolean[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'B':// byte
        for (int k = 0; k < o1.length; k++) {
         if (((byte[]) o1[0])[k] != ((byte[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'C':// char
        for (int k = 0; k < o1.length; k++) {
         if (((char[]) o1[0])[k] != ((char[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'D':// double
        for (int k = 0; k < o1.length; k++) {
         if (((double[]) o1[0])[k] != ((double[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'F':// float
        for (int k = 0; k < o1.length; k++) {
         if (((float[]) o1[0])[k] != ((float[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'I':// int
        for (int k = 0; k < o1.length; k++) {
         if (((int[]) o1[0])[k] != ((int[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'J':// long
        for (int k = 0; k < o1.length; k++) {
         if (((long[]) o1[0])[k] != ((long[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       case 'S':// short
        for (int k = 0; k < o1.length; k++) {
         if (((short[]) o1[0])[k] != ((short[]) o2[0])[k]) {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          break;
         }
        }
        break;
       }
      } else {// customer array
       if (o1[0] != null && o2[0] != null) {
        for (int k = 0; k < ((Object[]) o1[0]).length; k++) {
         if (o1[0] != null && o2[0] != null) {
          isSame = compare(((Object[]) o1[0])[k], ((Object[]) o1[0])[k]);
         } else if (o1[0] == null && o2[0] == null) {
          isSame = true;
          continue;
         } else {
          System.out.println("the method '" + key + "()' is different ...");
          isSame = false;
          continue;
         }
        }
       } else if (o1[0] == null && o2[0] == null) {
        isSame = true;
        continue;
       } else {
        System.out.println("the method '" + key + "()' is different ...");
        isSame = false;
        continue;
       }
      }
     } else {
      if (o1[0] != null && o2[0] != null) {
       isSame = compare(o1[0], o2[0]);
      } else if (o1[0] == null && o2[0] == null) {
       isSame = true;
       continue;
      } else {
       System.out.println("the method '" + key + "()' is different ...");
       isSame = false;
       continue;
      }
     }
    }

   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return isSame;
 }

 /**
  * get <code>getXxx()</code>
  *
  * @param object
  * @return
  * @throws Exception
  * @CreateOn May 8, 2009 2:27:46 PM
  * @author chun_chang
  */
 private static Map getGetMethod(final Object object) throws Exception {
  Method[] methods = object.getClass().getDeclaredMethods();
  Map map = new HashMap();
  for (int i = 0; i < methods.length; i++) {
   String method = methods[i].getName();
   if ("get".equals(method.substring(0, 3)) || "is".equals(method.substring(0, 2))) {
    Object objArr[] = new Object[2];
    objArr[0] = invokeMethod(object, method);
    objArr[1] = methods[i].getReturnType();
    map.put(method, objArr);
   }
  }
  return map;
 }

 /**
  * get the value of attribute
  *
  * @param obj
  * @param methodName
  * @return
  * @throws Exception
  * @CreateOn May 8, 2009 1:39:41 PM
  * @author chun_chang
  * @throws Exception
  */
 private static Object invokeMethod(Object obj, String methodName) throws Exception {
  Class ownerClass = obj.getClass();
  Method method = null;
  try {
   method = ownerClass.getMethod(methodName, null);
  } catch (NoSuchMethodException e) {
   System.out.println("error: can't find '" + methodName + "' method ...");
  } catch (Exception e) {
   e.printStackTrace();
  }
  return method.invoke(obj, null);
 }

}

 

若谁有更好的办法,欢迎一起探讨,MSN:changchun08521@hotmail.com

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐