我對java很陌生,所以如果你覺得這個問題沒有意義,我很抱歉。 只想詢問是否有可能收集對象的所有屬性,特別是那些不再是默認值的對象。例如,一些屬性已被設置爲新值的bean,我將如何才能夠獲得那些只有對象具有新值的更新屬性。 還是有辦法收集所有setter爲給定bean調用的方法?如何收集已更新對象的所有屬性?
0
A
回答
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)
}
然後在偵聽器中,您可以將所有更改存儲在集合中,例如。
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
相關問題
- 1. 如何訪問所有創建的對象和更新屬性
- 2. 如何更新不是對象的所有屬性?
- 3. 如何在運行驗收測試之前更新屬性對象的屬性?
- 4. 如何遍歷所有對象屬性
- 5. 如何綁定已經是已綁定對象屬性的對象的屬性?
- 6. 垃圾收集:對象屬性
- 7. 收集所有數據屬性?
- 8. Vue.js - 對象屬性更新
- 9. 更新對象屬性
- 10. 更新JavaScript對象屬性?
- 11. 如何觀察模型對象上的所有屬性更改?
- 12. 更新對象屬性的ObservableCollecttion已更改
- 13. 讓所有對象屬性
- 14. 「元組」對象沒有屬性「更新」
- 15. AttributeError:...對象沒有屬性'更新'
- 16. **更新**'NoneType'對象沒有屬性'天'
- 17. Symfony2的形式,對象的集合,發行更新現有對象屬性
- 18. 如何強制NHibernate不更新集合中的所有對象
- 19. 如何更新除註釋之外的對象的所有屬性@JsonIgnore
- 20. python - 從屬性存在的對象列表中收集屬性
- 21. 如何收集對象列表中的單個屬性?
- 22. javascript/omniture - 如何清除對象(s對象)的所有屬性
- 23. 如何過濾所有屬性爲對象的對象?
- 24. 如何使用新屬性註釋所有對象?
- 25. 如何有效地更新對象的屬性
- 26. 如何使用LINQ to Entities更新現有對象的屬性?
- 27. 如何觀察所有對象屬性更改?
- 28. PetaPoco/NPoco - 保存具有(子)收集屬性的對象
- 29. 如何更新已移動到對象內部的屬性的引用
- 30. 「CompanyUser」對象有沒有屬性「所有」
您是否有一個特定的bean在其中想要檢測並採取非默認屬性值;或者你是否需要對許多豆類進行「一般」操作?我採取的方法會有所不同,因爲通用解決方案要困難得多。 – corlettk 2011-05-02 10:22:49