關於Spring的BeanUtils

文章《用Spring的BeanUtils前,建議你先了解這幾個坑》裏面,做者最後獲得了這幾個結論:java

1.Spring得BeanUtils得CopyProperties方法須要對應得屬性有getter和setter方法;
2.若是存在屬性徹底相同得內部類,可是不是同一個內部類,即分別屬於各自得內部類,則Spring會認爲屬性不一樣,不會Copy;
3.泛型只在編譯期起做用,不能依靠泛型來作運行期得限制;
4.最後,Spring和Apache得copy屬性得方法源和目的參數得位置正好相反,因此導包和調用得時候須要注意如下。
在這裏,咱們今天重點說的是第二點,第一點是由於用反射拿到set和get方法再去拿屬性值和設置屬性值的,不懂反射的人能夠自行百度下。第三和第四點很簡單了應該是不須要解釋的。測試

驗證

首先,我把我本身的測試代碼也貼出來:this

@Data
public class TestEntity{
private Integer age;
private String name;
private Inner inner;3d

@Data
public static class Inner{
    private Integer a;
    public Inner(Integer a){
        this.a = a;
    }
}

}code

@Data
public class TestVO{
private Integer age;
private String name;
private Inner inner;對象

@Data
public static class Inner{
    private Integer a;
    public Inner(Integer a){
        this.a = a;
    }
}

}blog

public class Main{
public static void main(String args[]){
TestEntity entity = new TestEntity();
entity.setAge(1);
entity.setName("hehe");
entity.setInner(new TestEntity.Inner(1));get

TestVO vo = new TestVO();
    BeanUtils.copyProperties(entity,vo);
    System.out.println(vo.toString());
    
}

}
以上就是我得三個類,是否是超級簡單,好比工做中將entity轉vo,就有這種使用場景,運行main方法,測試結果和那個做者得出的第二點的結論是同樣的,b對象裏面的inner是null!虛擬機

file
可是這個是爲何呢?這個是BUG嗎?這個也是我今天要說的重點。it

內部類

咱們知道,java給咱們提供了內部類這樣的東東,可是java的內部類,它其實只是java的一個語法糖而已(不知道什麼是語法糖的請自行百度),那麼咱們定義得兩個JAVA類裏面的Inner的真面目究竟是怎樣的呢?

來到編譯後的.class文件目錄下,咱們能夠看到編譯後得.class文件:

file
哈哈,不知道讀者到這裏是否是能明白些什麼了呢?爲何通過BeanUtils.CopyProperties(entity,vo)以後,vo裏面的inner仍是null,由於TestEntity.java和TestVO.java裏面的Inner在編譯以後的class名字都不同(表明加載到虛擬機以後的地址不一樣),怎麼可能拷貝成功呢?

那麼問題來了哈,咱們怎樣用才能讓其拷貝成功呢?我稍微修改了下個人代碼以下:

@Data
public class TestVO{
private Integer age;
private String name;
private TestEntity.Inner inner;

}
僅僅是把Inner變爲了TestEntity.Inner,刪掉了沒引用得內部類Inner,Main.java不變,而後運行結果以下:

file
能夠看到,b對象裏面的inner被成功拷貝過來。

此時編譯後得class文件也由5個變爲了4個
file

相關文章
相關標籤/搜索