将字段值设置为同一Class的另一个实例

时间:2010-02-23 01:55:37

标签: java reflection

class Foo(){
   private String x,y;
   //getters setters 
}
main(){
   Foo bar1 = new Foo();
   Foo bar2 = new Foo();
   bar1.setX("hey");
   bar2.setX("hi");
   bar2.setY(" there");
   setNewValuesFromLeftToRight(bar1,bar2);//left:bar1
   System.out.print(bar2.getX+bar2.getY)// hey there
}

setNewValuesFromLeftToRight:此方法将获得具有相同类的任何2个对象,并使用bar1的字段值(非空)设置bar2的字段值 编写方法setNewValuesFromLeftToRight的最佳方法是什么?确定它应该是通用解决方案。 我会用反射吗?

4 个答案:

答案 0 :(得分:2)

您可以使用Commons BeanUtils而不是手动执行此操作。

BeanUtils.copyProperties(bar2, bar1);

答案 1 :(得分:2)

我读取这些要求的方式是,如果左(源)bean中存在相应的非空值,则应覆盖右(目标)bean中的任何属性。所以这与覆盖所有属性(包括空源值)的PropertyUtils.copyProperties略有不同。

一种可能性是使用Jakarta Commons BeanUtils,然后您可以使用

PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(leftBean);
if (descriptors != null) {
  for (PropertyDescriptor descriptor : descriptors) {
    try {
      String propertyName = descriptor.getName();
      Object val = PropertyUtils.getProperty(leftBean, name);
      if (val != null) {
        PropertyUtils.setProperty(rightBean, name, val);
      }
    } catch (Exception ignore) {
      // not interested in what we can't read or write
    }
  }
}

答案 2 :(得分:0)

如果你想拥有这样一个功能并且它需要是通用的,那么唯一的方法就是使用反射。您必须遍历所有变量并检查公共setter和getter并使用它。如果你想要特定的类,copy constructor的修改版本应该可以做到这一点

答案 3 :(得分:0)

如果Foo中的字段是公开的,那么您可以使用反射直接复制字段。但是,你真的不想公开你的所有领域,对吗? ; - )

如果您有一个公认的约定,例如Java Bean使用的约定,其中每个字段都需要相应的“get”和“set”方法,那么您可以遍历所有第一个对象的getter方法,调用它们,以及将结果值传递给第二个对象的setter方法。但是,这对于没有正确的getter和setter的任何字段都不起作用。