Java 7から導入されたjava.util.Objects#equalsを使うと2つのオブジェクトが等しいか簡単に評価できるようになりました。しかし、特定のプロパティを除き2つのオブジェクトが等しいか評価する用途には使えなかったので書いてみました。
引数obj1と引数obj2のどちらもnullの場合は同じ、どちらか片方だけがnullのときは同じではないと評価します。それ以外の場合はプロパティごとにjava.util.Objects#equalsを使って評価します。
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.Objects; public class BeanCompare { /** * 2つのBeanに含まれるプロパティを比較し同一か判定する。 * 比較の際、excludeProperiesで指定されたプロパティ名は対象から除外する * * @param <T> Beanの型 * @param obj1 比較する1つめのBean * @param obj2 比較する2つめのBean * @param excludeProperies 比較から除外するプロパティ名 * @return trueのとき一致 * @see java.util.Objects#equals(Object, Object) * */ public static <T extends Serializable> boolean equals(T obj1, T obj2, Collection<String>excludeProperies) { if (obj1 == null && obj2 == null) { return true; } if (obj1 == null || obj2 == null) { return false; } try { BeanInfo bi = Introspector.getBeanInfo(obj1.getClass()); PropertyDescriptor[] pds = bi.getPropertyDescriptors(); for (PropertyDescriptor pd:pds) { if (excludeProperies.contains(pd.getName())) { continue; } Method getter = pd.getReadMethod(); Object val1 = getter.invoke(obj1); Object val2 = getter.invoke(obj2); if (!Objects.equals(val1, val2)) { return false; } } return true; } catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new RuntimeException(e); } } }
Please give us your valuable comment