使用reflection比较字段值

我试图以通用方式比较两个不同对象的字段值。 我有一个函数(如下所示),它接收两个对象,然后获取字段,然后比较循环中的字段,如果它们不相同,则将字段添加到列表中 – 这是正确的方法吗?

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() – 我知道没有像这样的方法,但也许还有另一种方法???

您可以查看org.apache.commons.lang.builder.EqualsBuilder,如果您想进行现场比较,可以为您节省很多麻烦。

 org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals(Object, Object) 

如果您想自己比较字段,请查看java.lang.Class.getDeclaredFields() ,它将为您提供包括非公共字段在内的所有字段。

要比较字段的值,请使用f.get(qa).equals(f.get(qa4))目前,您实际上是在比较字段实例而不是值。

如果要比较bean属性(getter返回的值)而不是比较字段值, commons-beanutils之类的库可以帮助您。

但是,如果你想坚持普通reflection,你应该:

  1. 使用Class.getDeclaredFields()而不是Class.getFields() ,因为后者只返回公共字段。
  2. 由于字段仅依赖于它们的类,因此应该缓存结果并将字段保存在静态/实例变量中,而不是为每个比较调用getDeclaredFields()
  3. 一旦你有了该类的对象(比如说o ),为了获得该特定对象的某个字段f的值,你需要调用: f.get(o)