2017-10-27 9 views
2

同じクラスの2つのインスタンスがあります.1つはすべてのフィールドに値を持ち、もう1つは一部のフィールドだけです(他のフィールドはnullです)。 2番目の値を使用して最初のオブジェクトの値を更新する場合は、nullでない場合にのみ更新します。このような何か:私はフィールドがたくさんある、と私はすべての私のオブジェクトにそのメソッドを実装する必要がある場合同じクラスの別のインスタンスからオブジェクトフィールドを取り込みます

class MyObject { 
    private void setObject(MyObject other) { 
     if (other.getField1() != null) this.field1 = other.getField1(); 
     .....     
    } 
} 

setObjectメソッドのコードは本当に長いです。私はそれがより一般的な方法で行うことができるかどうか疑問に思っていた:引数としてオブジェクトを取得する - >フィールドを反復 - >ヌルでない場合、

私はこれを行うためにいくつかのリフレクションの使用を試みましたが、今は失敗しています。

+0

これは反射で行うことができます。質問に試したコードを含めてください。 –

+0

あなたの質問は、基本的にhttps://stackoverflow.com/questions/1667854/copy-all-values-from-fields-in-one-class-to-other- through-reflectionの特殊なケースです。宛先クラスは同じです。 – azurefrog

+0

@azurefrog値をコピーする前にロジックを実行する必要があるので、正確にはそうではありません(ヌルチェック) – Sabrina

答えて

2

私はあなたが私がField[]を使用していますがgetterメソッドとsetterメソッドを持っている場合は、代わりにMethod[]を使用することができ、この

class MyObject{ 

public Integer a; 
public Integer b; 
public Integer c; 
} 

public class Reflect { 

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { 
     // TODO Auto-generated method stub 
     MyObject a = new MyObject(); 
     a.a=4; 
     MyObject b = new MyObject(); 
     b.a=2; 
     b.b=3; 
     b.c=5; 
     GenericInstancePopulateMethod(MyObject.class, a, b); 

     System.out.println(a.b);//this prints 3 as expected 
     System.out.println(a.a);//this prints 4 as expected 
    } 
    static void GenericInstancePopulateMethod(Class<MyObject> clz, MyObject a, MyObject b) throws IllegalArgumentException, IllegalAccessException{ 

     Field[] fields = clz.getFields(); 

     for(Field f : fields){ 
     if(f.get(a) == null) 
      f.set(a, f.get(b)) ;//a fields are assigned b fields' values 
     } 
    } 
} 

ようなものが必要だと思います。

+0

フィールドがプライベートな場合は、アクセス可能です。 –

+0

@Anton、Right、thanks。 –

関連する問題