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的最佳方法是什么?确定它应该是通用解决方案。 我会用反射吗?
答案 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的任何字段都不起作用。