我对java很新,所以如果你发现这个问题毫无意义,我很抱歉。 只想询问是否可以收集对象的所有属性,特别是那些不再是默认值的属性。例如,一个bean已经将某些属性设置为新值,我将如何获得那些仅在具有新值的对象时更新的属性。 或者有没有办法收集为该给定bean调用的所有setter方法?
答案 0 :(得分: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)
在任何“bean”上,这是一个由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的答案:只有当“bean”实际触发任何更改通知时它才是一个选项(它应该是,但这是另一个主题:-)此外,它无法捕获构造函数中设置的任何属性
答案 2 :(得分: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;
}
}