在 Java 中,“比较 Field 值”通常有两种理解:
下面分情况说明。
如果两个对象类型已知:
if (obj1.getName().equals(obj2.getName())) {
// 相等
}
基本类型用 ==,引用类型用 equals()。
import java.lang.reflect.Field;
public class FieldCompareUtil {
public static boolean compareField(Object a, Object b, String fieldName)
throws Exception {
if (a == null || b == null) return false;
Field field = a.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object valueA = field.get(a);
Object valueB = field.get(b);
if (valueA == null && valueB == null) return true;
if (valueA == null || valueB == null) return false;
return valueA.equals(valueB);
}
}
使用:
boolean same = FieldCompareUtil.compareField(user1, user2, "name");
public static boolean compareAllFields(Object a, Object b) throws Exception {
if (a == null || b == null) return false;
Class<?> clazz = a.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
Object v1 = field.get(a);
Object v2 = field.get(b);
if (v1 == null ? v2 != null : !v1.equals(v2)) {
return false;
}
}
return true;
}
int 用 ==Integer 用 equals反射中 field.get() 返回的是 包装类型。
equals() 对数组无效,需用:
java.util.Arrays.equals((Object[]) v1, (Object[]) v2);
field.get(null); // 静态字段
反射比直接调用慢,不要高频使用。
如果只是为了比较对象:
✅ 重写 equals() 和 hashCode()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(name, user.name);
}
如果你有具体场景(比如 DTO 对比、数据库实体、JSON 映射、忽略某些字段),可以告诉我,我可以给你更合适的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。