Java学习笔记 30 - 反射的使用&不同对象的相同属性值相互赋值(copy)

使用反射,将不同对象的相同属性值相互赋值。总结三种实用方法:
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'}

你可能感兴趣的:(Java学习笔记 30 - 反射的使用&不同对象的相同属性值相互赋值(copy))