java – equals和hashCode的通用反射辅助方法
发布时间:2020-12-15 04:53:33 所属栏目:Java 来源:网络整理
导读:我正在考虑为equals和hashCode创建一个反射辅助方法. 在equals的情况下,helper方法将反射API查找到objectA的字段,并将它们与objectB的字段进行比较. 在hashCode的情况下,helper方法查看字段的反射API并在迭代循环中计算hashCode. 好消息是我不必担心我的equa
我正在考虑为equals和hashCode创建一个反射辅助方法.
>在equals的情况下,helper方法将反射API查找到objectA的字段,并将它们与objectB的字段进行比较. 好消息是我不必担心我的equals或hashCode实现中缺少字段. 这是我的平等初稿: public final class ReflectiveEqualsHelper { public static boolean isEqual(final Object a,final Object b) { if (!isTypeEqual(a,b)) { return false; } Field[] fields = getFields(a); Object valueA; Object valueB; String fieldName; for (int i = 0; i < fields.length; i++) { fieldName = fields[i].getName(); valueA = getValueByFieldName(a,fieldName); valueB = getValueByFieldName(b,fieldName); if (!compare(valueA,valueB)) { return false; } } return true; } @SuppressWarnings("rawtypes") private static Field[] getFields(final Object o) { Class clazz = o.getClass(); Field[] fields = clazz.getDeclaredFields(); return fields; } private static Field getField(final Object o,final String name) { try { Field field = o.getClass().getDeclaredField(name); return field; } catch (NoSuchFieldException e) { throw new RuntimeException(e); } } private static Object getValueByFieldName(final Object o,final String name) { Field field = getField(o,name); field.setAccessible(true); try { Object value = field.get(o); field.setAccessible(false); return value; } catch (IllegalAccessException e) { throw new RuntimeException(e); } } private static boolean areBothNull(final Object a,final Object b) { return (a == null && b == null); } private static boolean isTypeEqual(final Object a,final Object b) { if (areBothNull(a,b)) { return false; } return a.getClass().equals(b.getClass()); } private static boolean compare(final Object a,final Object b) { if (a == null) { return false; } else if (b == null) { return false; } return a.equals(b); } } public class ReflectiveEqualsHelperTest { @Test public void testIsEqual() { Vector a = new Vector(Long.valueOf(1L),3L); Vector b = new Vector(Long.valueOf(1L),3L); Vector c = new Vector(Long.valueOf(2L),3L); boolean testA = ReflectiveEqualsHelper.isEqual(a,b); boolean testB = ReflectiveEqualsHelper.isEqual(a,c); boolean testC = ReflectiveEqualsHelper.isEqual(b,c); assertTrue(testA); assertFalse(testB); assertFalse(testC); } class Vector { public static final int STATIC = 1; private Long x; private long y; public Vector(Long x,long y) { super(); this.x = x; this.y = y; } public Long getX() { return x; } public void setX(Long x) { this.x = x; } public long getY() { return y; } public void setY(long y) { this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((x == null) ? 0 : x.hashCode()); result = prime * result + (int) (y ^ (y >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } return ReflectiveEqualsHelper.isEqual(this,obj); } } } 干杯,凯文 解决方法
看看
Apache Commons中的
EqualsBuilder,它是reflectionEquals方法.这个库还有一个
HashCodeBuilder很多其他有用的东西.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |