2011-05-02 32 views
0

我對java很陌生,所以如果你覺得這個問題沒有意義,我很抱歉。 只想詢問是否有可能收集對象的所有屬性,特別是那些不再是默認值的對象。例如,一些屬性已被設置爲新值的bean,我將如何才能夠獲得那些只有對象具有新值的更新屬性。 還是有辦法收集所有setter爲給定bean調用的方法?如何收集已更新對象的所有屬性?

+0

您是否有一個特定的bean在其中想要檢測並採取非默認屬性值;或者你是否需要對許多豆類進行「一般」操作?我採取的方法會有所不同,因爲通用解決方案要困難得多。 – corlettk 2011-05-02 10:22:49

回答

4

您可以在對象中註冊一個java.beans.PropertyChangeListener,並在調用每個setter時觸發一個事件。它看起來像:

public class Foo { 
    // some field here 
    private PropertyChangeListener listener; 

    public void setBar(String bar) { 
     this.bar = bar; 
     if (listener != null) { 
     listener.fireEvent(..); 
     } 
    } 
    // etc setters and getters 

    // setter for the listener 
    // (instead of a single listener, you may want a collection of listeners) 
} 

然後在偵聽器中,您可以將所有更改存儲在集合中,例如。

+1

+1爲標準的方式(儘管它像地獄一樣複雜) – 2011-05-02 10:37:29

+0

據我所知,在發生變化時捕捉變化並不是問題 – kleopatra 2011-05-02 11:38:33

+0

不是,但他想知道哪些屬性發生了變化。這就是爲什麼,在每次更改時,他都可以將更改後的屬性添加到集合中(我的最後一段) – Bozho 2011-05-02 11:39:41

0

沒有實現它的默認烘焙方式。如果我理解的很好,你想收集所有在bean中修改過的屬性。喜歡的東西:

MyBean bean = new MyBean(); 
bean.setName("john"); 
List modified = bean.getModifiedFields(); 

由於Bohzo建議你可以使用一個PropertyChangeListener觸發一個事件當屬性被修改,或者更簡單地說:

public class MyBean { 
    private Map<String, Object> modifiedValuesMap = new HashMap<String, Object>(); 
    private String name; 
    public void setName(String _name) { 
    name = _name; 
    modifiedValuesMap.put("name", _name); 

    }  
    public Map<String, Object> getModifiedValues() { 
    return modifiedValuesMap; 
    } 

} 
1

在任何「豆」,這是一類遊戲由bean規範,可以用內省/反射,這樣的:

public static class MyBean { 

    String myName; 

    public MyBean() { 
     this(null); 
    } 

    public MyBean(String name) { 
     setName(name); 
    } 

    public String getName() { 
     return myName; 
    } 

    public void setName(String name) { 
     this.myName = name; 
    } 
} 

public void testBeanProperties() throws Exception { 
    Object bean = new MyBean("myName"); 
    compareProperties(bean); 
} 

private void compareProperties(Object bean) throws Exception { 
    BeanInfo info = Introspector.getBeanInfo(bean.getClass()); 
    Object defaultInstance = bean.getClass().newInstance(); 
    PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); 
    for (PropertyDescriptor descriptor : descriptors) { 
     Object defaultValue = getValue(defaultInstance, descriptor); 
     Object myValue = getValue(bean, descriptor); 
     if (!areEqual(myValue, defaultValue)) { 
      System.out.println("default/changed: " + defaultValue + "/" + myValue); 
     } 
    } 
} 

public Object getValue(Object bean, PropertyDescriptor propertyDescriptor) throws Exception { 
    Method getter = propertyDescriptor.getReadMethod(); 
    if (getter != null) 
     return getter.invoke(bean, (Object[]) null); 
    return null; 
} 

如涉及一個PropertyChangeListener的答案:這是隻有在「豆」實際上觸發任何瓚的選項ge通知(它應該,但這是另一個主題:-)另外,它不能捕獲在構造函數中設置的任何屬性。

+0

這是追蹤變化的好方法,但它涉及創建一個新對象和反射。無論如何。 – Bozho 2011-05-02 11:41:10

相關問題