1. 程式人生 > >父類和子類同時存在相同屬性BeanUtils的copyProperties複製

父類和子類同時存在相同屬性BeanUtils的copyProperties複製

一、幾種屬性拷貝方法比較

1.幾種拷貝方法對比

①org.apache.commons.beanutils.BeanUtils;
②org.apache.commons.beanutils.PropertyUtils;
③org.springframework.beans.BeanUtils
對比1: PropertyUtils的copyProperties()方法幾乎與BeanUtils.copyProperties()相同,主要的區別在於後者提供型別轉換功能,即發現兩個JavaBean的同名屬性為不同型別時,在支援的資料類型範圍內進行轉換,PropertyUtils不支援這個功能,所以說BeanUtils速度會更快一些,使用更普遍一點,犯錯的風險更低一點。

2.關於BeanUtils

1)Spring 中的BeanUtils與apache中的BeanUtils區別

org.apache.commons.beanutils.BeanUtils#copyProperties方法會進行型別轉換,預設情況下會將Ineger、Boolean、Long等基本型別包裝類為null時的值複製後轉換成0或者false,有時這個可能會引起不必要的麻煩。
而org.springframework.beans.BeanUtils.copyProperties(bookDto, book);則不會!
關於import org.apache.commons.beanutils.BeanUtils的一些該注意的地方:
BeanUtils支援的轉換型別如下:

	BigDecimal					BigInteger
	boolean and Boolean			byte and Byte	
	char and Character			Class
	double and Double			float and Float
	int and Integer				long and Long
	short and Short				String
	java.sql.Date				java.sql.Time
	java.sql.Timestamp

這裡要注意一點,java.util.Date是不被支援的,而它的子類java.sql.Date是被支援的。因此如果物件包含時間型別的屬性,且希望被轉換的時候,一定要使用java.sql.Date型別。否則在轉換時會提示argument mistype異常。

2)效能測試

原來公司裡面有個技術大牛對org.apache.commons.beanutils.BeanUtils和org.springframework.beans.BeanUtils拷貝效能進行測試,spring 包BeanUtils的效能更佳。

二、.BeanUtils父類和子類同時存在相同名稱屬性的拷貝

1.問題

父類存在一個屬性,子類extends父類又寫了相同的屬性,在物件屬性拷貝後,屬性的值存放在哪。

2.實驗

1)程式碼準備

父類

package bean;
import lombok.Data;
@Data
public class Parent {

    private String name;
    
    private String age;
}

子類

@Data
public class Son extends Parent {
    //屬性名與父類相同
    private String name;
    private Integer soz;

}

copy source類

package bean;

import lombok.Data;

@Data
public class Person {
    //屬性名相同,型別相同
    private String name;
    //屬性名相同,型別不同
    private Long age;

    private Integer soz;
}

測試類

package bean;


public class CopyTest {

    public static void main(String[] args) throws Exception{
        Person person = new Person();
        person.setName("person");
        person.setAge(1L);
        person.setSoz(0);

        //子類
        Son son = new Son();
        //copy
        org.springframework.beans.BeanUtils.copyProperties(person,son);
        org.apache.commons.beanutils.BeanUtils.copyProperties(son,person);
    }
}

在這裡插入圖片描述

拷貝後,son.name有值,parent.name為空。
通過查閱BeanUtils.copyProperties方法原始碼,發現屬性是通過反射呼叫setter設定屬性值,而子類與父類的setName方法同名,相當於子類覆蓋了父類的方法,所以拷貝之後屬性的值存在於子類的屬性中。
這一點,可以在子類中加上下面方法驗證

 public void setName(String name) {
        super.setName(name);
        this.name = name;
    }

在這裡插入圖片描述