使用反射俏让,將不同對象的相同屬性值相互賦值楞遏。總結(jié)三種實用方法:
1)使用對象的get,set方法為屬性賦值
2)使用java.lang.*下的reflect包首昔,實現(xiàn)對象之間相同屬性值復制
3)使用commons-beanutils包下的BeanUtils工具類的copyProperties方法直接復制
詳細使用請參考以下代碼寡喝。
存在兩個person類,有相同的屬性勒奇,使用反射將其中一個對象中的屬性值copy到另一個對象相同的屬性中预鬓。
Person1.class
package com.test.ref;
public class Person1 {
private String name;
private String sex;
private int age;
private String p1;
private String p2;
private String p3;
private String p4;
public Person1(String name, String sex, int age, String p1, String p2, String p3, String p4) {
this.name = name;
this.sex = sex;
this.age = age;
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.p4 = p4;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getP1() {
return p1;
}
public void setP1(String p1) {
this.p1 = p1;
}
public String getP2() {
return p2;
}
public void setP2(String p2) {
this.p2 = p2;
}
public String getP3() {
return p3;
}
public void setP3(String p3) {
this.p3 = p3;
}
public String getP4() {
return p4;
}
public void setP4(String p4) {
this.p4 = p4;
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", p1='" + p1 + '\'' +
", p2='" + p2 + '\'' +
", p3='" + p3 + '\'' +
", p4='" + p4 + '\'' +
'}';
}
}
Person2.class
package com.test.ref;
public class Person2 {
private String p1;
private String p2;
private String p3;
private String p4;
public String getP2() {
return p2;
}
public void setP2(String p2) {
this.p2 = p2;
}
public String getP3() {
return p3;
}
public void setP3(String p3) {
this.p3 = p3;
}
public String getP4() {
return p4;
}
public void setP4(String p4) {
this.p4 = p4;
}
public String getP1() {
return p1;
}
public void setP1(String p1) {
this.p1 = p1;
}
@Override
public String toString() {
return "Person2{" +
"p1='" + p1 + '\'' +
", p2='" + p2 + '\'' +
", p3='" + p3 + '\'' +
", p4='" + p4 + '\'' +
'}';
}
}
方法一:使用對象的get,set方法為屬性賦值
public static void main(String args[]){
Person1 p1 = new Person1("張三", "男",28,"test1","test2","test3","test4");
Person2 p2 =new Person2();
p2.setP1(p1.getP1());
p2.setP2(p1.getP2());
p2.setP3(p1.getP3());
p2.setP4(p1.getP4());
System.out.println(p2);
}
輸出結(jié)果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}
方法二:使用java.lang.*下的reflect包,實現(xiàn)對象之間相同屬性值復制
1赊颠、將反射類屬性的方法封裝成copy格二,使用時直接傳參
public static void copyBean(Object from,Object to){
Class person1 = from.getClass();
Class person2 = to.getClass();
//獲取person2的所有屬性
Field[] person2Fields = person2.getDeclaredFields();
for (Field p2field:person2Fields){
p2field.setAccessible(true); //設(shè)置person2可以訪問
// System.out.println(p2field.getName());
try {
//獲取person1的對應(yīng)屬性
Field p1field = person1.getDeclaredField(p2field.getName());
//設(shè)置person1可以訪問
p1field.setAccessible(true);
//將person1的對應(yīng)屬性值 給person2
p2field.set(to,p1field.get(from));
} catch (Exception e) {
e.printStackTrace();
}
}
2、調(diào)用copyBean方法竣蹦,并傳入需要copy的對象
public static void main(String args[]){
Person1 p1 = new Person1("張三", "男",28,"test1","test2","test3","test4");
Person2 p2 =new Person2();
copyBean(p1,p2);
System.out.println(p2);
}
輸出結(jié)果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}
方法三:使用commons-beanutils包下的BeanUtils工具類
BeanUtils中copyProperties的作用是將一個對象中的屬性值賦值(拷貝)給另一個對象中對應(yīng)的屬性顶猜,并且對象之間可以沒有任何聯(lián)系。其中賦值成功的屬性對應(yīng)的屬性名和屬性類型必須相同痘括,否則對應(yīng)的屬性值不會從一個對象賦值給另一個對象长窄,但是此時不影響其他屬性值的拷貝.
public static void main(String args[]){
Person1 p1 = new Person1("張三", "男",28,"test1","test2","test3","test4");
Person2 p2 =new Person2();
BeanUtils.copyProperties(p2,p1); //p2為目標滔吠,p1為源
System.out.println(p2);
}
輸出結(jié)果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}