2010-02-23 72 views
1
class Foo(){ 
    private String x,y; 
    //getters setters 
} 
main(){ 
    Foo bar1 = new Foo(); 
    Foo bar2 = new Foo(); 
    bar1.setX("hey"); 
    bar2.setX("hi"); 
    bar2.setY(" there"); 
    setNewValuesFromLeftToRight(bar1,bar2);//left:bar1 
    System.out.print(bar2.getX+bar2.getY)// hey there 
} 

setNewValuesFromLeftToRight:該方法將得到相同的類中的任何2對象,並使用字段值BAR2的設置字段值,即不爲空,BAR1的
是什麼編寫setNewValuesFromLeftToRight方法的最佳方法是什麼?肯定它應該是通用的解決方案。 我會使用反射?設置字段值到同一類的其他實例

+0

我們無法猜測你想要的功能做什麼。 – bmargulies 2010-02-23 01:58:28

+0

那麼,'setNewValuesFromLeftToRight()'應該在這裏做什麼?它是否將bar2的所有字段都設置爲bar1中相應字段的值? – 2010-02-23 02:00:57

+0

我只是試圖描述它 – dupdup 2010-02-23 02:06:45

回答

2

我讀取這些要求的方式是,如果左(源)bean中存在相應的非空值,則應該覆蓋右(目標)bean中的任何屬性。所以這與PropertyUtils.copyProperties略有不同,它會覆蓋所有屬性(包括null源值)。

一種可能性是使用Jakarta Commons BeanUtils,那麼你可以使用

PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(leftBean); 
if (descriptors != null) { 
    for (PropertyDescriptor descriptor : descriptors) { 
    try { 
     String propertyName = descriptor.getName(); 
     Object val = PropertyUtils.getProperty(leftBean, name); 
     if (val != null) { 
     PropertyUtils.setProperty(rightBean, name, val); 
     } 
    } catch (Exception ignore) { 
     // not interested in what we can't read or write 
    } 
    } 
} 
+0

我認爲這會做很多技巧thx我明天會嘗試 – dupdup 2010-02-23 02:38:59

0

如果你想有這樣一個功能,它需要是通用的,唯一的方法就是使用反射。你必須遍歷所有的變量,並檢查公開的setter和getters並使用它。如果你想要它的特定類copy constructor修改後的版本應該做的竅門

+0

複製構造不是解決方案,因爲所請求的功能是**合併**而不是**克隆** – bmichalik 2014-03-20 09:48:31

1

而不是手動這樣做,你可以使用Commons BeanUtils

BeanUtils.copyProperties(bar2, bar1); 
+0

嗯,通過第一次查看問題,我認爲他正在嘗試複製所有的屬性,但顯然不是。他試圖追加值,而不是替換它們 – 2010-02-23 02:13:16

+0

im cheking BeanUtils和@teja是的我試圖從左到右拷貝不是null,如在示例bar1中有y:null – dupdup 2010-02-23 02:20:36

0

如果Foo的領域是公共的,那麼你可以直接使用反射覆制的字段。但是,你並不是真的想要公開所有的領域,是嗎? ;-)

如果您有一個可接受的約定,例如Java Bean使用的約定,其中每個字段都需要相應的「get」和「set」方法,則可以遍歷所有第一個對象的getter方法,調用它們,並將結果值傳遞給第二個對象的setter方法。但是,這對任何沒有正確的獲得者和制定者的領域都是行不通的。

相關問題