需求:
项目中,有两个类,没有继承关系,大部分字段相同,只有个别字段不同,现在一个类是有值的,需要将两个类中相同字段复制到另一个类中。
思路:
本来准备自己写反射来实现,后来发现有一个类 BeanUtils.copyProperties 可以完美实现这个需求,这个类Maven仓库中有两个包都包含有,分别是
org.apache.commons.beanutils.BeanUtils
org.springframework.beans.BeanUtils
测试
首先准备两个实体类
TestObject1
class TestObject1{
private Integer age;
private String name;
private Integer weight;
public TestObject1(Integer age, String name, Integer weight) {
this.age = age;
this.name = name;
this.weight = weight;
}
@Override
public String toString() {
return "TestObject1{" +
"age=" + age +
", name='" + name + '\'' +
", weight=" + weight +
'}';
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
}
TestObject2
class TestObject2{
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "TestObject2{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
然后开始测试
import org.springframework.beans.BeanUtils;
import java.lang.reflect.InvocationTargetException;
//import org.apache.commons.beanutils.BeanUtils;
//import java.lang.reflect.InvocationTargetException;
/**
* @author mazheng
* @className TestDemo
* @date 2021/9/13 14:45
* @description TODO
*/
public class TestDemo {
//包org.apache.commons.beanutils.BeanUtils, 则结果是:
//value2拷贝到value1上,即value2的值会覆盖到value1上;
//
//包org.springframework.beans.BeanUtils, 则结果是:
//value1拷贝到value2上,即value1的值会覆盖到value2上。
public static void main(String[] args) {
TestObject1 testObject1 = new TestObject1(1,"tom",16);
//TestObject2 testObject2 = new TestObject2();
TestObject2 testObject2 = new TestObject2();
System.out.println("交换前的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
System.out.println(testObject1);
System.out.println(testObject2);
BeanUtils.copyProperties(testObject1,testObject2);
System.out.println("交换后的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
System.out.println(testObject1);
System.out.println(testObject2);
System.out.println("更改后的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
testObject1.setName("马汉三");
System.out.println(testObject1);
System.out.println(testObject2);
//TestObject1 testObject1 = new TestObject1(1,"tom",16);
//TestObject2 testObject2 = new TestObject2();
//System.out.println("交换前的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
//System.out.println(testObject1);
//System.out.println(testObject2);
//try {
// BeanUtils.copyProperties(testObject2,testObject1);
//} catch (IllegalAccessException e) {
// e.printStackTrace();
//} catch (InvocationTargetException e) {
// e.printStackTrace();
//}
//System.out.println("交换后的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
//System.out.println(testObject1);
//System.out.println(testObject2);
}
}
结果
TestObject2{age=null, name='null'}
交换后的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
TestObject1{age=1, name='tom', weight=16}
TestObject2{age=1, name='tom'}
更改后的值》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
TestObject1{age=1, name='马汉三', weight=16}
TestObject2{age=1, name='tom'}
确实达到了我想要的结果
上面注释掉的代码是测试 org.apache.commons.beanutils.BeanUtils 类的代码,这个类根据idea的提示,参数跟spring的BeanUtils是相反的,这里要注意,此外,这个类并没有实现我的需求,调用方法之后没有复制成功,具体原因因为工作时间缘故没有去深究,这里记录一下,有时间再看看。