2011-05-02 70 views
0

我对java很陌生,所以如果你觉得这个问题没有意义,我很抱歉。 只想询问是否有可能收集对象的所有属性,特别是那些不再是默认值的对象。例如,一些属性已被设置为新值的bean,我将如何才能够获得那些只有对象具有新值的更新属性。 还是有办法收集所有setter为给定bean调用的方法?如何收集已更新对象的所有属性?

+0

您是否有一个特定的bean在其中想要检测并采取非默认属性值;或者你是否需要对许多豆类进行“一般”操作?我采取的方法会有所不同,因为通用解决方案要困难得多。 – corlettk 2011-05-02 10:22:49

回答

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为标准的方式(尽管它像地狱一样复杂) – 2011-05-02 10:37:29

+0

据我所知,在发生变化时捕捉变化并不是问题 – kleopatra 2011-05-02 11:38:33

+0

不是,但他想知道哪些属性发生了变化。这就是为什么,在每次更改时,他都可以将更改后的属性添加到集合中(我的最后一段) – Bozho 2011-05-02 11:39:41

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

相关问题