11

2 つの異なるオブジェクトのフィールド値を一般的な方法で比較しようとしています。2 つのオブジェクトを取り込んでフィールドを取得し、ループ内のフィールドを比較して、同じでない場合はフィールドをリストに追加する関数 (以下を参照) があります。これはこれを行う適切な方法ですか?

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()私はこのような方法がないことを知っていますが、別の方法があるかもしれませんか???

4

3 に答える 3

16

フィールドごとの比較を行いたい場合は、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)) 現在、実際には値ではなくフィールド インスタンスを比較しています。

于 2012-11-21T15:10:46.727 に答える
3

commons-beanutilsのようなライブラリは、フィールド値を比較する代わりに、Beanプロパティ(ゲッターによって返される値)を比較する場合に役立ちます。

ただし、単純な反射に固執したい場合は、次のことを行う必要があります。

  1. Class.getDeclaredFields()の代わりに使用Class.getFields()します。後者はパブリックフィールドのみを返すためです。
  2. getDeclaredFields()フィールドはクラスにのみ依存するため、比較ごとに呼び出すのではなく、結果をキャッシュして、フィールドを静的/インスタンス変数に保持する必要があります。
  3. そのクラスのオブジェクト(たとえばo)を取得したら、その特定のオブジェクトのフィールドの値を取得するには、次fを呼び出す必要がありますf.get(o)
于 2012-11-21T15:16:44.137 に答える
0

// すべてのフィールドではなく一部のフィールドが必要な場合は、これを使用します。

  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;
}
于 2018-10-30T14:38:06.753 に答える