【发布时间】:2012-11-09 20:49:00
【问题描述】:
我正在尝试以通用方式比较两个不同对象的字段值。我有一个函数(见下文),它接受两个对象,然后获取字段,然后在循环中比较字段,如果字段不相同,则将字段添加到列表中 - 这是正确的方法吗?
public void compareFields(Object qa, Object qa4) throws FieldsNotEqualException
{
Field[] qaFields = qa.getClass().getFields();
Field[] qa4Fields = qa4.getClass().getFields();
for(Field f:qaFields)
{
for(Field f4:qa4Fields)
{
if(f4.equals(f))
{
found = true;
break;
}
else
{
continue;
}
}
}
if(!found)
{
report.add(/*some_formatted_string*/) //some global list
throw new FieldsNotEqualException();
}
}
我在谷歌上搜索,发现 C# 有一个 PropertyInfo 类——Java 有类似的东西吗?
另外,有没有办法像f.getFieldValue()一样做-我知道没有这样的方法,但也许还有另一种方法???
【问题讨论】:
-
字段属于类,值保存在实例中(如果不是静态的)。你到底想完成什么?
-
好吧,我应该更清楚一点——我传入两个对象的两个实例——我试图比较 hibernate 返回的两个数据集(对象列表)——但我将它们传递给一次循环某个类的对象的一个实例,以将该实例的字段与其他实例进行比较
-
@JohH 如果您使用的是 Hibernate,这种方法可能不起作用 - Hibernate 在运行时修改对象内容,我不确定反射是否会起作用 - 它可能会起作用,但如果您遇到一些有趣的事情,它可能是 Hibernate 干扰了对象属性。
-
@RaviWallau 我认为 Hibernate 已经完成了对这些对象的干扰......我运行了一个查询,然后从 Hibernate 返回一个 List
-
@JohH 如果您使用 IntelliJ,您可以自动生成 equals() 和 hashCode()。比起使用反射来比较数据,我更喜欢这些,因为反射不能限制将要比较的字段。
标签: java reflection field