使用反射,将不同对象的相同属性值相互赋值。总结三种实用方法:
1)使用对象的get,set方法为属性赋值
2)使用java.lang.*下的reflect包,实现对象之间相同属性值复制
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);
}
输出结果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}
方法二:使用java.lang.*下的reflect包,实现对象之间相同属性值复制
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); //设置person2可以访问
// System.out.println(p2field.getName());
try {
//获取person1的对应属性
Field p1field = person1.getDeclaredField(p2field.getName());
//设置person1可以访问
p1field.setAccessible(true);
//将person1的对应属性值 给person2
p2field.set(to,p1field.get(from));
} catch (Exception e) {
e.printStackTrace();
}
}
2、调用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);
}
输出结果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}
方法三:使用commons-beanutils包下的BeanUtils工具类
BeanUtils中copyProperties的作用是将一个对象中的属性值赋值(拷贝)给另一个对象中对应的属性,并且对象之间可以没有任何联系。其中赋值成功的属性对应的属性名和属性类型必须相同,否则对应的属性值不会从一个对象赋值给另一个对象,但是此时不影响其他属性值的拷贝.
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);
}
输出结果:Person2{p1='test1', p2='test2', p3='test3', p4='test4'}
网友评论