簡體   English   中英

使用反射比較字段值

[英]Comparing field values using 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))目前,您實際上是在比較字段實例而不是值。

commons-beanutils這樣的庫如果你想比較bean屬性(getter返回的值)而不是比較字段值,可以幫助你。

但是,如果你想堅持普通反射,你應該:

  1. 使用Class.getDeclaredFields()而不是Class.getFields() ,因為后者只返回公共字段。
  2. 由於字段僅依賴於其類,因此應緩存結果並將字段保留在靜態/實例變量中,而不是為每個比較調用getDeclaredFields()
  3. 一旦你有了該類的對象(比如說o ),為了獲得該特定對象的某個字段f的值,你需要調用: f.get(o)

//如果你想要一些字段,那么不是所有字段都使用它。

  public boolean compareObject(Object object) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException 
{

 String[] compareFields = { "fieldx", "fieldy","fieldz", "field15",
        "field19"}; // list of all we need 
for(String s : compareFields) {
Field field = DcrAttribute.class.getDeclaredField(s); // get a list of all fields for this class
    field.setAccessible(true);
    if(!field.get(this).equals(field.get(object))){  //if values are not equal          
    return true;    
    }       

    }

    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM