Javaで特定のプロパティを除いて2つのBeanを比較する

水曜日 , 27, 5月 2020 Leave a comment

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

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください