聊聊BeanUtils.copyProperties和clone()方法的區(qū)別
最近擼代碼的時(shí)候發(fā)現(xiàn)有人將一個(gè)對(duì)象的值賦給另一個(gè)對(duì)象的時(shí)候,并沒有使用常規(guī)的set/get方法去給對(duì)象賦值,而是采用BeanUtils.copyProperties(A,B)這個(gè)方法去賦值,但是有的還是有局限性,比如Date類型的值無(wú)法賦值,只能賦值為null,所以我大致百度了一下,作為記錄。
首先,BeanUtils有兩種:
org.springframework.beans和org.apache.commons.beanutils,前面是spring的,后面是apache公司的。
效率:
傳統(tǒng)的set/get>spring的>apache的
我們首先來(lái)使用一下效率最慢的org.apache.commons.beanutils
需要在pom文件中引入這個(gè)包
并且要配合第三方的日志工具來(lái)使用,一般都是使用的是common logging包
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.2</version> </dependency>
在引入完成之后,我們新建一個(gè)類TestBean,里面有兩個(gè)屬性,userName和password
private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
然后我們?cè)傩陆ㄒ粋€(gè)類CopyBean,這個(gè)類中的屬性和上面的TestBean類相同
private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
然后我們寫我們的main方法
public static void main(String[] args) { TestBean bean = new TestBean(); bean.setUserName("qxf"); bean.setPassword("123"); CopyBean copyBean = new CopyBean(); try { //這個(gè)地方如果你安裝了阿里的代碼檢測(cè)控件的話,會(huì)報(bào)錯(cuò),提示你使用spring的BeanUtils,而不要使用apache的BeanUtils BeanUtils.copyProperties(copyBean,bean); System.out.println(copyBean.getUserName()); System.out.println(copyBean.getPassword()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
執(zhí)行結(jié)果
接下來(lái)我們?cè)賮?lái)使用一下spring的org.springframework.beans
在pom文件里面引入所需要的包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.0.7.RELEASE</version> </dependency>
然后新建CopyBean和TestBean兩個(gè)類,這兩個(gè)和上述的相同,因此在此不再贅述
Main方法
public static void main(String[] args) { TestBean bean = new TestBean(); bean.setUserName("qxf"); bean.setPassword("123"); CopyBean copyBean = new CopyBean(); //這個(gè)和apache的恰恰相反,具體的原因需要查看源碼才可以理解 BeanUtils.copyProperties(bean,copyBean); System.out.println(copyBean.getUserName()); System.out.println(copyBean.getPassword()); }
輸出結(jié)果:
可見兩者實(shí)現(xiàn)的結(jié)果是相同的,但是兩者的效率是不一樣的
而我們?cè)诳碿lone()方法的時(shí)候,發(fā)現(xiàn)也是類似的,也可以將對(duì)象中的屬性copy到另一個(gè)對(duì)象的屬性中
新建一個(gè)實(shí)體類StudentEntity實(shí)現(xiàn)Cloneable接口
/** * @Description: * @Author: qxf * @Date: 2019/2/21 2:22 PM */ public class StudentEntity implements Cloneable { private String userName; private String passWord; private List<String> list; public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
測(cè)試方法
public void testClone(){ //測(cè)試clone方法 StudentEntity entity = new StudentEntity(); entity.setUserName("qxf"); entity.setPassWord("test"); List<String> list = new ArrayList<>(); list.add("Test1"); list.add("Test2"); list.add("Test3"); list.add("Test4"); entity.setList(list); try { StudentEntity entityClone = (StudentEntity) entity.clone(); System.out.println(entityClone.getUserName()); System.out.println(entityClone.getPassWord()); List<String> entityList = new ArrayList<>(); entityList = entityClone.getList(); for (int i=0;i<entityList.size();i++){ System.out.println(entityList.get(i)); } }catch (Exception e){ e.printStackTrace(); } }
但是clone()的方法和copyProperties的區(qū)別還有待學(xué)習(xí)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring實(shí)現(xiàn)bean對(duì)象創(chuàng)建代碼詳解
這篇文章主要介紹了spring實(shí)現(xiàn)bean對(duì)象創(chuàng)建代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12jpa使用uuid策略后無(wú)法手動(dòng)設(shè)置id的問(wèn)題及解決
這篇文章主要介紹了jpa使用uuid策略后無(wú)法手動(dòng)設(shè)置id的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08如何在Spring?Boot中使用MyBatis訪問(wèn)數(shù)據(jù)庫(kù)
MyBatis可以通過(guò)簡(jiǎn)單的XML或者注解來(lái)配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫(kù)中記錄,使用MyBatis幫助我們解決各種問(wèn)題,本文介紹如何在Spring?Boot中使用MyBatis訪問(wèn)數(shù)據(jù)庫(kù),感興趣的朋友一起看看吧2023-11-11詳解使用Spring Boot開發(fā)Restful程序
本篇文章主要介紹了詳解使用Spring Boot開發(fā)Restful程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java中RSA加密解密的實(shí)現(xiàn)方法分析
這篇文章主要介紹了Java中RSA加密解密的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了java實(shí)現(xiàn)RSA加密解密算法的具體步驟與相關(guān)操作技巧,并附帶了關(guān)于RSA算法密鑰長(zhǎng)度/密文長(zhǎng)度/明文長(zhǎng)度的參考說(shuō)明,需要的朋友可以參考下2017-07-07Java JSON轉(zhuǎn)成List結(jié)構(gòu)數(shù)據(jù)
這篇文章主要介紹了Java JSON轉(zhuǎn)成List結(jié)構(gòu)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09SpringBoot使用SOFA-Lookout監(jiān)控的方法
本文介紹SpringBoot使用螞蟻金服SOFA-Lookout配合Prometheus進(jìn)行監(jiān)控,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03