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

Java 如何收集已更新对象的所有属性?,java,Java,我是java新手,如果您觉得这个问题毫无意义,我向您道歉。 只是想问一下是否可以收集对象的所有属性,特别是那些不再是默认值的属性。例如,一个bean,其中一些属性被设置为新的值,我如何才能获得那些只在对象中包含新值的情况下更新的属性。。 或者有没有一种方法可以收集为给定bean调用的所有setter方法?您可以在对象中注册一个,并在调用每个setter时触发一个事件。它看起来像: public class Foo { // some field here private Proper

我是java新手,如果您觉得这个问题毫无意义,我向您道歉。 只是想问一下是否可以收集对象的所有属性,特别是那些不再是默认值的属性。例如,一个bean,其中一些属性被设置为新的值,我如何才能获得那些只在对象中包含新值的情况下更新的属性。。 或者有没有一种方法可以收集为给定bean调用的所有setter方法?

您可以在对象中注册一个,并在调用每个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)
}
然后,您可以在侦听器中存储集合中的所有更改,例如

您可以在对象中注册,并在调用每个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)
}

然后,您可以在侦听器中存储集合中的所有更改,例如

实现它没有默认的方法。如果我理解得很好,您希望收集bean中修改过的所有属性。比如:

MyBean bean = new MyBean();
bean.setName("john");
List modified = bean.getModifiedFields();
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;
}
正如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;
   }

}
公共类MyBean{
私有映射modifiedValuesMap=newHashMap();
私有字符串名称;
public void setName(字符串_name){
名称=_名称;
modifiedValuesMap.put(名称);
}      
公共映射getModifiedValues(){
返回修改后的值映射;
}
}

实现它没有默认的方法。如果我理解得很好,您希望收集bean中修改过的所有属性。比如:

MyBean bean = new MyBean();
bean.setName("john");
List modified = bean.getModifiedFields();
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;
}
正如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;
   }

}
公共类MyBean{
私有映射modifiedValuesMap=newHashMap();
私有字符串名称;
public void setName(字符串_name){
名称=_名称;
modifiedValuesMap.put(名称);
}      
公共映射getModifiedValues(){
返回修改后的值映射;
}
}
在任何“bean”(由bean规范运行的类)上,您可以使用内省/反射,例如:

MyBean bean = new MyBean();
bean.setName("john");
List modified = bean.getModifiedFields();
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”实际触发任何更改通知时(应该触发,但这是另一个主题:-),这才是一个选项,而且它不能捕获构造函数中设置的任何属性。

对于任何“bean”,即由bean规范运行的类,您可以使用内省/反射,比如:

MyBean bean = new MyBean();
bean.setName("john");
List modified = bean.getModifiedFields();
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”实际触发任何更改通知(它应该触发,但这是另一个主题:-)时,这才是一个选项,而且它无法捕获构造函数中设置的任何属性。

您是否有一个特定的bean,您希望在其中检测非默认属性值并对其进行操作;或者你需要对很多豆子“通用”地这样做吗?我会采取不同的方法,因为通用解决方案要困难得多;或者你需要对很多豆子“通用”地这样做吗?我会采取不同的方法,因为通用的解决方案要困难得多。+1对于标准方法(尽管它非常复杂),据我所知,在发生变化时捕捉变化不是问题,但他想知道哪些属性发生了变化。这就是为什么每次更改时,他都可以将更改后的属性添加到集合(我的最后一段)嗯。。。这是在他/她开始倾听后收集更改的内容。要求是“仅在对象中有新值的情况下更新的属性。”-这是在他/她有机会开始侦听之前。我假设当他创建对象时,他也可以注册侦听器。据我所知,标准方式为+1(尽管非常复杂),问题不是在发生变化时捕捉变化,但他想知道哪些属性发生了变化。这就是为什么每次更改时,他都可以将更改后的属性添加到集合(我的最后一段)嗯。。。这是在他/她开始倾听后收集更改的内容。要求是“仅在对象中有新值的情况下更新的属性。”-那是在他/她有机会开始侦听之前。我假设当他创建对象时,他也可以注册侦听器。这是跟踪更改的好方法,尽管它涉及到创建新对象和反射+无论如何,这是一种很好的跟踪变化的方法,尽管它涉及到一个新对象的创建和反射+1无论如何。