美文网首页软件测试学习之路
Java学习笔记 30 - 反射的使用&不同对象的相同属

Java学习笔记 30 - 反射的使用&不同对象的相同属

作者: 乘风破浪的姐姐 | 来源:发表于2018-09-20 12:52 被阅读8次

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

        本文链接:https://www.haomeiwen.com/subject/xjubnftx.html