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