我对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. Vue.js - 对象属性更新
- 3. 更新JavaScript对象属性?
- 4. 如何观察模型对象上的所有属性更改?
- 5. **更新**'NoneType'对象没有属性'天'
- 6. AttributeError:...对象没有属性'更新'
- 7. Symfony2的形式,对象的集合,发行更新现有对象属性
- 8. 如何强制NHibernate不更新集合中的所有对象
- 9. 如何更新除注释之外的对象的所有属性@JsonIgnore
- 10. python - 从属性存在的对象列表中收集属性
- 11. 如何收集对象列表中的单个属性?
- 12. 如何过滤所有属性为对象的对象?
- 13. javascript/omniture - 如何清除对象(s对象)的所有属性
- 14. 如何使用新属性注释所有对象?
- 15. 如何有效地更新对象的属性
- 16. 如何更新对象数组中所有对象的键值?
- 17. 如何通知视图模型的所有属性已更改
- 18. 如何更新ObservableMap中对象属性更改的视图?
- 19. 更新树枝中的对象属性
- 20. 更新与$集合对象的嵌套属性设置
- 21. Django:查询集中对象的更新顺序属性
- 22. 按对象的所有属性分组
- 23. 查找对象的所有属性
- 24. 获取所有值的属性对象
- 25. 修改集合对象的属性将删除所有其他属性
- 26. 更新dynamodb表中的所有属性
- 27. 将所有的属性或只有属性,我要更新?
- 28. “查询集”对象没有属性
- 29. Django的错误<model>对象有没有属性“更新”
- 30. 没有类型的对象没有属性更新
您是否有一个特定的bean在其中想要检测并采取非默认属性值;或者你是否需要对许多豆类进行“一般”操作?我采取的方法会有所不同,因为通用解决方案要困难得多。 – corlettk 2011-05-02 10:22:49