It is often necessary to copy the properties of two objects in a business system, and it is not possible to deny that the individual object copies are the fastest and safest way, but the code becomes bloated when the number of attribute fields of the data object exceeds the level of tolerance of the programmer, such as usually more than 5 attributes. Using some handy object Copy tool classes will be a good choice.
The more commonly accepted tool classes are now popular:
Two versions of Apache: (Reflection mechanism)
Org.apache.commons.beanutils.PropertyUtils.copyProperties (Object dest, Object orig)
Org.apache.commons.beanutils.BeanUtils.copyProperties (Object dest, Object orig)
Spring version: (Reflection mechanism)
Org.springframework.beans.BeanUtils.copyProperties (object source, object target, Class editable, string[] Ignoreproperties)
The new version of spring also integrates the Cglib version: Org.springframework.cglib.beans.BeanCopier
Cglib version: (Use dynamic agent, high efficiency)
Net.sf.cglib.beans.BeanCopier.copy (Object ParamObject1, Object ParamObject2, Converter paramconverter)
Dozer version (XML configuration map, lowest performance):
Org.dozer.DozerBeanMapper.map (Object source, class<t> Destinationclass)
As far as the API is concerned, it doesn't matter which tool class to use, we usually care about two points, functional integrity and performance.
Performance test:
//Source Pojo Packagetf56.lf.lfbase.model.dto;Importjava.io.Serializable;Importtf56.lf.lfbase.model.domain.LfProduct;/*** Classname:productdto * *@version1.0 *@sincev1.0 * @Date June 19, 2017 Yuebiao.wu*/ Public classProductdtoextendsLfproductImplementsserializable{Private Static Final LongSerialversionuid = -1296801547926874402l;}//Target Pojo PackageTf56.lf.lfbase.model.domain;Importjava.io.Serializable;Importjava.util.Date;ImportLombok. Getter;ImportLombok. Setter;/*** classname:product * *@authorTool *@version1.0 *@sincev1.0 * Date June, 2:40:42 PM*/@Getter @setter Public classLfproductImplementsSerializable {Private Static Final LongSerialversionuid = 4054863309367744108L; /*Product ID*/ PrivateString Lfproductid; /*Logistics Financial Account*/ PrivateString Lfaccountid; /*Product Name*/ PrivateString ProductName; /*type of product (Baofu: Guarantee and payment; Miaofu: Second payment; Jishifu: Instant payment;)*/ PrivateString ProductType; /*List of applicable scenarios (comma separated) (COD: Collect payment; FREIGHT: freight;)*/ PrivateString scenetypes; /*Product Description*/ PrivateString ProductDescription; /*Product Rule Description*/ PrivateString productroledescription; /*Loan triggering behavior*/ PrivateString loanaction; /*Collection triggering behavior*/ PrivateString repayaction; /*Product status (enable: enabled; DISABLE: deactivate;)*/ PrivateString Productstatus; /*Warning threshold*/ PrivateLong warnbalance; /*whether the consignor controls the amount (1: yes; 0: no;)*/ PrivateInteger Isconsignercreditlimit; /*whether the carrier controls the amount (1: yes; 0: no;)*/ PrivateInteger Isexpresscreditlimit; PrivateString Productagreementurl; PrivateString Poundagecalctype; PrivateString poundagerate; /*Remark 1*/ PrivateString Remark1; /*operator Number*/ PrivateString Operatorid; /*Enter Date*/ PrivateDate inputdate; /*Record Update Time*/ PrivateDate stampdate; }
Beancopier
Mapper wrapper =NewDozerbeanmapper (); Productdto PDT=Newproductdto (); Pdt.setisconsignercreditlimit (3); Pdt.setloanaction ("323f3"); Pdt.setproductname ("Feiwefe"); Pdt.setpoundagerate ("F332r3"); LongBeg =System.currenttimemillis (); Propertyutilsbean Bean=NewPropertyutilsbean (); Beancopier Copier= Beancopier.create (productdto.class, Lfproduct.class,false); for(inti=0;i<1000;i++) {lfproduct LFPDT=Newlfproduct ();//try {//try {//bean.copyproperties (LFPDT, PDT);//} catch (Illegalaccessexception | InvocationTargetException e) {// //TODO auto-generated Catch block//e.printstacktrace ();// }//} catch (Nosuchmethodexception e) {// //TODO auto-generated Catch block//e.printstacktrace ();// }Copier.copy (PDT, LFPDT,NULL); if(i==3) {//System.out.println (Jacksonhelper.tojson (LFPDT)); }//LFPDT = Wrapper.map (PDT, lfproduct.class);Lfpdt.setinputdate (NewDate ()); } System.out.println (System.currenttimemillis ()-beg);
About 140ms or so.
Mapper wrapper =NewDozerbeanmapper (); Productdto PDT=Newproductdto (); Pdt.setisconsignercreditlimit (3); Pdt.setloanaction ("323f3"); Pdt.setproductname ("Feiwefe"); Pdt.setpoundagerate ("F332r3"); LongBeg =System.currenttimemillis (); Propertyutilsbean Bean=NewPropertyutilsbean (); Beancopier Copier= Beancopier.create (productdto.class, Lfproduct.class,false); for(inti=0;i<1000;i++) {lfproduct LFPDT=NULL;//try {//try {//bean.copyproperties (LFPDT, PDT);//} catch (Illegalaccessexception | InvocationTargetException e) {// //TODO auto-generated Catch block//e.printstacktrace ();// }//} catch (Nosuchmethodexception e) {// //TODO auto-generated Catch block//e.printstacktrace ();// }//copier.copy (PDT, LFPDT, NULL); if(i==3) {//System.out.println (Jacksonhelper.tojson (LFPDT));} LFPDT= Wrapper.map (PDT, lfproduct.class); Lfpdt.setinputdate (NewDate ()); } System.out.println (System.currenttimemillis ()-beg);
2500ms.
Propertyutilsbean
Mapper wrapper =NewDozerbeanmapper (); Productdto PDT=Newproductdto (); Pdt.setisconsignercreditlimit (3); Pdt.setloanaction ("323f3"); Pdt.setproductname ("Feiwefe"); Pdt.setpoundagerate ("F332r3"); LongBeg =System.currenttimemillis (); Propertyutilsbean Bean=NewPropertyutilsbean (); Beancopier Copier= Beancopier.create (productdto.class, Lfproduct.class,false); for(inti=0;i<1000;i++) {lfproduct LFPDT=Newlfproduct (); Try { Try{bean.copyproperties (LFPDT, PDT); } Catch(Illegalaccessexception |invocationtargetexception e) { //TODO auto-generated Catch blockE.printstacktrace (); } } Catch(nosuchmethodexception e) {//TODO auto-generated Catch blockE.printstacktrace (); }//copier.copy (PDT, LFPDT, NULL); if(i==3) {//System.out.println (Jacksonhelper.tojson (LFPDT)); }//LFPDT = Wrapper.map (PDT, lfproduct.class);Lfpdt.setinputdate (NewDate ()); } System.out.println (System.currenttimemillis ()-beg);
Around 240ms.
So, because most of them are simple copy copies, in this case, Beancopyer>propertyutils>dozer.
Reference:
http://blog.csdn.net/jianhua0902/article/details/8155368
http://blog.csdn.net/liangrui1988/article/details/41802275
Java Bean Attribute Copy tool analogy pair (performance + function)