在 Java 中,“Field 字段怎么比较”通常有几种不同场景,下面按常见情况给你说明:
如果你已经拿到 Field 对象,可以通过反射获取值再比较:
import java.lang.reflect.Field;
public class Demo {
public static void main(String[] args) throws Exception {
User u1 = new User("Tom", 18);
User u2 = new User("Tom", 20);
Field field = User.class.getDeclaredField("name");
field.setAccessible(true);
Object v1 = field.get(u1);
Object v2 = field.get(u2);
System.out.println(v1.equals(v2));
}
}
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
⚠️ 注意:
field.get() 会返回包装类(如 Integer)Objects.equals(v1, v2)Field f1 = User.class.getDeclaredField("name");
Field f2 = User.class.getDeclaredField("name");
System.out.println(f1 == f2); // false
System.out.println(f1.equals(f2)); // false(Field 未重写 equals)
✅ 正确方式:
boolean same = f1.getName().equals(f2.getName())
&& f1.getDeclaringClass().equals(f2.getDeclaringClass());
或者直接用:
f1.equals(f2); // 不推荐
常见做法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
public static boolean compareFields(Object a, Object b, String... fieldNames)
throws Exception {
for (String name : fieldNames) {
Field f = a.getClass().getDeclaredField(name);
f.setAccessible(true);
if (!Objects.equals(f.get(a), f.get(b))) {
return false;
}
}
return true;
}
setAccessible(true)field.get(null)Objects.equals如果你是指:
可以告诉我具体场景,我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。