如何收集已更新的对象的所有属性?

时间:2011-05-02 10:17:24

标签: java

我对java很新,所以如果你发现这个问题毫无意义,我很抱歉。 只想询问是否可以收集对象的所有属性,特别是那些不再是默认值的属性。例如,一个bean已经将某些属性设置为新值,我将如何获得那些仅在具有新值的对象时更新的属性。 或者有没有办法收集为该给定bean调用的所有setter方法?

3 个答案:

答案 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;
   }

}