2011-10-06 80 views
5
public class MyClass{ 
    public String elem1; 
    public int elem2; 
    public MyType elem3; 
................. 
} 

MyClass object1=new MyClass(); 
MyClass object2=new MyClass(); 
object1.elem1=... 
object1.elem2=... 
... 
object2.elem1=... 
object2.elem2=null 
..... 

我要的是一樣的東西如何合併Java對象動態

object1.merge(object2); 

它會動態遍歷的MyClass的所有成員,並運行此每個成員

if(object1.elem != object2.elem && object2.elem!=null) 
object1.elem=object2.elem; 

就是這樣的機制存在於Java中?

回答

8

使用反射。 越過類的領域。 Psuedo:

Field[] fields = aClass.getFields(); 
for (Field field : fields) { 
    // get value 
    Object value = field.get(objectInstance); 
    // check the values are different, then update 
    field.set(objetInstance, value);  
} 

並匹配值。如果它們不同,則更新該值。

1

您可以使用反射自己編寫這樣一個方法(從Class.getFields()開始),但是沒有工具可以在標準API中執行此操作。

0

沒有什麼內置的,但你可能想看看Dozer。也許有一些調整它將能夠做到這一點。

您也可以使用反射(這是推土機所做的)來做到這一點。

2

一個選項的效率比反射將是存儲領域中的地圖:

Map<String, Object> fields; 

void merge(MyClass other){ 
    for (String fieldName : fields.keys()){ 
     Object thisValue = this.fields.get(key); 
     Object otherValue = other.fields.get(key); 
     if (thisValue != otherValue && otherValue != null){ 

       this.fields.put(fieldName, otherValue); 
     } 
    } 
} 

這將使合併更有效率,而且也使得一般的字段的訪問效率較低。