当前位置: 首页 > 面试题库 >

使用反射比较字段值

蓝泰平
2023-03-14
问题内容

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

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)) 当前,您实际上是在比较字段实例而不是值。



 类似资料:
  • 问题内容: 我正在与一个非开源项目合作,我需要修改一个或多个其类。 在一个类中是以下集合: 我需要做的就是在这里使用反射和并发hashmap。我试过下面的代码,但是不起作用。 问题答案: 希望这是您要尝试做的事情: 它打印:

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 问题内容: 我的Firestore集合的文档带有字符串字段,该字段可以为 null 。 我期望如果我查询: 我将获取“ producedDate”早于“ 2018-10-15”的所有产品,包括那些“ producedDate”为空的产品。 但是实际上我没有得到s。 这是故意的还是一个错误? 问题答案: 它打算以这种方式工作。该文档指出: 当查询涉及具有 混合类型值的 字段时,Cloud Fires

  • 问题内容: 我试图通过将结果对象与原始对象进行比较来验证例程的序列化和反序列化。这些例程可以序列化任意的和深层嵌套的类,因此,我需要一个比较例程,该例程可以提供原始实例和最终实例,并反射性地遍历每种值类型并比较这些值,然后迭代地浸入引用类型以比较值。 我已经尝试过Apache Commons Lang,但这似乎并没有进行很深入的比较,它只是比较引用类型是否相等,而没有深入研究它们: 以下代码说明了

  • 我正在创建许多POJO,并且必须为每个POJO创建方法。我认为创建一个类来使用反射API为我完成工作会更容易——在一个地方创建功能并在每个POJO中使用它。 POJO中的所有字段都是私有的。POJO是JSON对象的Java对象表示。 要求是遍历类中的字段,并列出字段和值。 我目前正在一个名为的类上测试该功能。 下面是我用来列出字段名和值的类: 我将< code>ChannelResource类的一

  • 假设我有几个这样的类: 我想迭代所有包含的子类(不是继承的),并获得嵌套对象树中所有字段的列表。但是,当我使用这样的反射代码时: 在“do somethine here”步骤中,我想访问myField的子字段,但在Field api中没有看到任何直接允许我这样做的内容。我试过: MyField.getDeclaringClass(). getDeclaredFields()- 和 MyField.