天天看點

使用springframework中BeanUtils.copyProperties的坑

target 必須是 editable 的子類。

source 屬性的 get 方法必須是 public 才能複制。

target 屬性沒有 set 方法的無法複制。

target 的 set 方法不是 public 無法複制。

對于某一個相同屬性名的屬性: 如果 source 和 target 不同類型,無法複制; source 和 target 類型相同,可以複制; source extends target 可以複制。

特殊的屬性 List 類型,如果 List<T>,source 中的 T 和 target 中的 T 類型不一緻,雖然可以複制成功,但是在調用時,會導緻 java.lang.ClassCastException。

1、判斷 target 是否是 editable 的子類。如果不是就報錯,是的話就繼續下面的邏輯。

2、取出 target 的所有屬性。

3、對 target 的每一個屬性進行周遊。

     3.1、拿到 target 屬性的 set 方法。排除不需要複制的屬性。拿不到,傳回。

     3.2、取出 source 屬性的 set 和 get 方法。

     3.3、判斷 target 的 set 的類是否能轉化為 source 的 get 類。無法轉換,傳回。

     3.4、判斷 source 的 get 方法是否是 public。

     3.5、使用反射調用 source 的 get 方法,擷取到值。

     3.6、判斷 target 的 set 方法是否是 public 修飾。

     3.7、使用反射調用 target 的 set 方法,設定值。

4、複制屬性成功,進行下一個屬性的複制。

可以看到, 成員變量指派是基于目标對象的成員清單, 并且會跳過ignore的以及在源對象中不存在的, 是以這個方法是安全的, 不會因為兩個對象之間的結構差異導緻錯誤, 但是必須保證同名的兩個成員變量類型相同.