一行代码完成两个属性相同的对象的值同步,免去所有的get set
START
如有Avo和Bvo两个属性相同但地址不同的对象,Avo有值,Bvo需要把Avo的值全部同步过来,重复的get set使我们崩溃,强大的Spring为我们提供了一个方法解决了这个问题,下面记录一下我的demo。
public class Avo { private String id; private String name; private String age; public String getId() {return id;} public void setId(String id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() {return age;} public void setAge(String age) { this.age = age;} }
public class Bvo { private String id; private String name; private String age; public String getId() {return id;} public void setId(String id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() {return age;} public void setAge(String age) {this.age = age;} @Override public String toString() { return "Bvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + '}'; } }
测试类:
public class test { public static void main(String[] args) { //一行代码完成两个属性相同的对象的值同步,免去所有的get set。 Avo avo = new Avo(); Bvo bvo = new Bvo(); /** * 普通表层对象值同步 * Avo与Bvo内的属性全部相同。 * 给Avo初始化值,然后同步转换给Bvo, */ avo.setId("0001"); avo.setName("至尊宝"); avo.setAge("500"); BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo System.out.println("Bvo"+bvo); }
执行结果:可以看出Avo的值以及全部同步给Bvo了。
单纯的对象同步就这样了,下面再说说对象内还有对象的情况了。
一:对象内置对象(内对象相同):
public class Cvo { private String id; private String name; public String getId() { return id;} public void setId(String id) {this.id = id;} public String getName() {return name; } public void setName(String name) { this.name = name;} @Override public String toString() { return "Cvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } }
public class Avo { private String id; private String name; private String age; private Cvo cvo;//内置对象 public String getId() {return id;} public void setId(String id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getAge() {return age;} public void setAge(String age) { this.age = age;} public Cvo getCvo() {return cvo;} public void setCvo(Cvo cvo) { this.cvo = cvo;} }
public class Bvo { private String id; private String name; private String age; private Cvo cvo;//内置对象 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) {this.name = name;} public String getAge() { return age; } public void setAge(String age) {this.age = age;} public Cvo getCvo() { return cvo;} public void setCvo(Cvo cvo) { this.cvo = cvo; } @Override public String toString() { return "Bvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", cvo=" + cvo + '}'; } }
//Avo与Bvo内都有Cvo的情况
测试:
public class test { public static void main(String[] args) { //一行代码完成两个属性相同的对象的值同步,免去所有的get set。 Avo avo = new Avo(); Bvo bvo = new Bvo(); Cvo cvo = new Cvo(); avo.setId("0001"); avo.setName("至尊宝"); avo.setAge("500"); cvo.setId("101010"); cvo.setName("秦祥林"); avo.setCvo(cvo); BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo System.out.println(bvo); }
执行结果:
二:对象内置对象集合和数组:
import java.util.List; public class Avo { private String id; private String name; private String age; private Cvo cvo; private List<Cvo> cvoList;//内置对象集合 private Cvo[] cvos;//内置对象数组 public String getId() {return id;} public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() {return age; } public void setAge(String age) { this.age = age; } public Cvo getCvo() {return cvo;} public void setCvo(Cvo cvo) { this.cvo = cvo;} public List<Cvo> getCvoList() {return cvoList; } public void setCvoList(List<Cvo> cvoList) {this.cvoList = cvoList;} public Cvo[] getCvos() { return cvos; } public void setCvos(Cvo[] cvos) { this.cvos = cvos; } }
import java.util.List; public class Bvo { private String id; private String name; private String age; private Cvo cvo; private List<Cvo> cvoList;//内置对象集合 private Cvo[] cvos;//内置对象数组public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Cvo getCvo() { return cvo;} public void setCvo(Cvo cvo) { this.cvo = cvo; } public List<Cvo> getCvoList() {return cvoList;} public void setCvoList(List<Cvo> cvoList) { this.cvoList = cvoList;} public Cvo[] getCvos() { return cvos; } public void setCvos(Cvo[] cvos) { this.cvos = cvos; } @Override public String toString() { return "Bvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", cvo=" + cvo + ", cvoList=" + cvoList + '}'; } }
List集合测试:
public class test { public static void main(String[] args) { //一行代码完成两个属性相同的对象的值同步,免去所有的get set。 Avo avo = new Avo(); Bvo bvo = new Bvo(); Cvo cvo = new Cvo(); Cvo cvoTo = new Cvo(); List<Cvo> cvos = new ArrayList<>(); avo.setId("0001"); avo.setName("至尊宝"); avo.setAge("500"); cvo.setId("101010"); cvo.setName("秦祥林"); cvos.add(cvo); cvoTo.setId("202020"); cvoTo.setName("秦汉"); cvos.add(cvoTo); avo.setCvoList(cvos); BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo System.out.println(bvo); }
执行结果:
数组测试:(这里要先重写下Bvo的toString(),我就不贴代码了)
public class test { public static void main(String[] args) { //一行代码完成两个属性相同的对象的值同步,免去所有的get set。 Avo avo = new Avo(); Bvo bvo = new Bvo(); Cvo cvo = new Cvo(); Cvo cvoTo = new Cvo(); List<Cvo> cvos = new ArrayList<>(); Cvo[] cvoNums = new Cvo[2]; avo.setId("0001"); avo.setName("至尊宝"); avo.setAge("500"); cvo.setId("101010"); cvo.setName("秦祥林"); cvoNums[0]=cvo; cvoTo.setId("202020"); cvoTo.setName("秦汉"); cvoNums[1]=cvoTo; avo.setCvos(cvoNums); BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo System.out.println(bvo); }
执行结果:
由此可见,spring的BeanUtils帮我们实现了同步两个相同属性的对象的值,它支持了大部分的参数类型,还有其他的类型我就没有一个个的试了,有兴趣的可以自己去试试,我觉得应该都没问题,如果有试到不支持的参数类型的同学请留言一下,谢谢。
注意:
上面所试的都是Avo与Bvo内的对象都为Cvo,假如这里还有一个Dvo对象且与Cvo的属性完全相同,然后Avo里的是Cvo,Bvo里的是Dvo,那就有问题了,如下:
//Dvo与Cvo的属性完全一样 public class Dvo { private String id; private String name; public String getId() {return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Dvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } }
public class Avo { private String id; private String name; private String age; private Cvo cvo;//Avo对象里的是Cvo public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Cvo getCvo() {return cvo;} public void setCvo(Cvo cvo) { this.cvo = cvo;} }
public class Bvo { private String id; private String name; private String age; private Dvo dvo;//Bvo对象里的是Dvo public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() {return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age;} public Dvo getDvo() {return dvo;} public void setDvo(Dvo dvo) {this.dvo = dvo;} @Override public String toString() { return "Bvo{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", dvo=" + dvo + '}'; } }
测试:
public class test { public static void main(String[] args) { //一行代码完成两个属性相同的对象的值同步,免去所有的get set。 Avo avo = new Avo(); Bvo bvo = new Bvo(); Cvo cvo = new Cvo(); Dvo dvo = new Dvo(); avo.setId("0001"); avo.setName("至尊宝"); avo.setAge("500"); cvo.setId("101010"); cvo.setName("秦祥林"); avo.setCvo(cvo); BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo System.out.println(bvo); }
执行结果:
由此可见如果对象内的对象仅是属性相同但对象不同的话是无法同步里面的那个对象的,
我尝试过想先把内对象给同步了,但是报了IllegalArgumentException,
Dvo dvo = bvo.getDvo(); System.out.println(dvo); BeanUtils.copyProperties(avo.getCvo(),dvo);
无辙,里面的对象就只能get set了 ,痛苦。麻烦有找到这种情况的解决方法的请留言告诉本菜鸟一声,小生感激不尽。
END