Java學習筆記 30 - 反射的使用&不同對象的相同屬性值相互賦值(copy)

使用反射俏让,將不同對象的相同屬性值相互賦值楞遏。總結(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'}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挠日,隨后出現(xiàn)的幾起案子疮绷,更是在濱河造成了極大的恐慌,老刑警劉巖肆资,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矗愧,死亡現(xiàn)場離奇詭異,居然都是意外死亡郑原,警方通過查閱死者的電腦和手機唉韭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犯犁,“玉大人属愤,你說我怎么就攤上這事∷嵋郏” “怎么了住诸?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涣澡。 經(jīng)常有香客問我贱呐,道長,這世上最難降的妖魔是什么入桂? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任奄薇,我火速辦了婚禮,結(jié)果婚禮上抗愁,老公的妹妹穿的比我還像新娘馁蒂。我一直安慰自己,他們只是感情好蜘腌,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布沫屡。 她就那樣靜靜地躺著,像睡著了一般撮珠。 火紅的嫁衣襯著肌膚如雪沮脖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天芯急,我揣著相機與錄音倘潜,去河邊找鬼。 笑死志于,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的废睦。 我是一名探鬼主播伺绽,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奈应?” 一聲冷哼從身側(cè)響起澜掩,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杖挣,沒想到半個月后肩榕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡惩妇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年株汉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌殃。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡乔妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓皱,到底是詐尸還是另有隱情路召,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布波材,位于F島的核電站股淡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏廷区。R本人自食惡果不足惜唯灵,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躲因。 院中可真熱鬧早敬,春花似錦、人聲如沸大脉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镰矿。三九已至琐驴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秤标,已是汗流浹背绝淡。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苍姜,地道東北人牢酵。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像衙猪,于是被迫代替她去往敵國和親馍乙。 傳聞我的和親對象是個殘疾皇子布近,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359