對象屬性複製的三種方法: 1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties兩種方式 BeanUtils.copyProperties("轉換後的類", "要轉換的類"); //多一步類型轉換,比PropertyUtils效率 ...
對象屬性複製的三種方法:
1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties兩種方式
BeanUtils.copyProperties("轉換後的類", "要轉換的類"); //多一步類型轉換,比PropertyUtils效率還差
PropertyUtils.copyProperties("轉換後的類", "要轉換的類");
口訣:後付錢(後付前:後面的複製給前面)會拋異常
2.spring提供的BeanUtil.copyProperties方式
BeanUtils.copyProperties("要轉換的類", "轉換後的類");
和Apache參數順序相反
3.cglib提供的copy方式
BeanCopier copy=BeanCopier.create("要轉換的類", "轉換後的類", false);
copy.copy(from, to, null);
4.spring提供的copy方式
BeanCopier copy=BeanCopier.create("要轉換的類", "轉換後的類", false);
copy.copy(from, to, null);
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * Created by hunt on 2017/6/28. 3 */ 4 @Data 5 public class TestFrom { 6 private String name; 7 }View Code
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import lombok.Data; 2 3 /** 4 * Created by hunt on 2017/6/28. 5 */ 6 @Data 7 public class TestTo { 8 private String name; 9 }View Code
第一種Apache方式的BeanUtils效率測試:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.apache.commons.beanutils.BeanUtils; 2 3 import java.lang.reflect.InvocationTargetException; 4 5 /** 6 * Created by hunt on 2017/6/28. 7 */ 8 public class TestDemo { 9 public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { 10 TestFrom testFrom = new TestFrom(); 11 testFrom.setName("hunt"); 12 TestTo testTo = new TestTo(); 13 long begin = System.currentTimeMillis(); 14 for (int i = 0; i <1000000 ; i++) {//一百萬次 15 BeanUtils.copyProperties(testTo,testFrom); 16 } 17 long end = System.currentTimeMillis(); 18 long mis = end -begin; 19 System.out.println("apache的BeanUtils.copyProperties耗時" + mis +"毫秒"); 20 System.out.println(testTo); 21 } 22 }View Code
第一種Apache方式的PropertyUtils效率測試:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.apache.commons.beanutils.PropertyUtils; 2 3 import java.lang.reflect.InvocationTargetException; 4 5 /** 6 * Created by hunt on 2017/6/28. 7 */ 8 public class TestDemo { 9 public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { 10 TestFrom testFrom = new TestFrom(); 11 testFrom.setName("hunt"); 12 TestTo testTo = new TestTo(); 13 long begin = System.currentTimeMillis(); 14 for (int i = 0; i <1000000 ; i++) {//一百萬次 15 PropertyUtils.copyProperties(testTo,testFrom); 16 } 17 long end = System.currentTimeMillis(); 18 long mis = end -begin; 19 System.out.println("apache的PropertyUtils.copyProperties耗時" + mis +"毫秒"); 20 System.out.println(testTo); 21 } 22 }View Code
第二種Spring方式的BeanUtils效率測試:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.springframework.beans.BeanUtils; 2 3 /** 4 * Created by hunt on 2017/6/28. 5 */ 6 public class TestDemo { 7 public static void main(String[] args) { 8 TestFrom testFrom = new TestFrom(); 9 testFrom.setName("hunt"); 10 TestTo testTo = new TestTo(); 11 long begin = System.currentTimeMillis(); 12 for (int i = 0; i <1000000 ; i++) {//一百萬次 13 BeanUtils.copyProperties(testFrom,testTo);//沒拋異常 14 } 15 long end = System.currentTimeMillis(); 16 long mis = end -begin; 17 System.out.println("Spring的PropertyUtils.copyProperties耗時" + mis +"毫秒"); 18 System.out.println(testTo); 19 } 20 }View Code
第三種方式cglib的copy效率測試
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import net.sf.cglib.beans.BeanCopier; 2 3 /** 4 * Created by hunt on 2017/6/28. 5 */ 6 public class TestDemo { 7 public static void main(String[] args) { 8 TestFrom testFrom = new TestFrom(); 9 testFrom.setName("hunt"); 10 TestTo testTo = new TestTo(); 11 long begin = System.currentTimeMillis(); 12 for (int i = 0; i <1000000 ; i++) {//一百萬次 13 BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false); 14 copier.copy(testFrom,testTo,null); 15 } 16 long end = System.currentTimeMillis(); 17 long mis = end -begin; 18 System.out.println("cglib的copier.copy耗時" + mis +"毫秒"); 19 System.out.println(testTo); 20 } 21 }View Code
第四種方式Spring的copy效率測試
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.springframework.cglib.beans.BeanCopier; 2 3 /** 4 * Created by hunt on 2017/6/28. 5 */ 6 public class TestDemo { 7 public static void main(String[] args) { 8 TestFrom testFrom = new TestFrom(); 9 testFrom.setName("hunt"); 10 TestTo testTo = new TestTo(); 11 long begin = System.currentTimeMillis(); 12 for (int i = 0; i <1000000 ; i++) {//一百萬次 13 BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false); 14 copier.copy(testFrom,testTo,null); 15 } 16 long end = System.currentTimeMillis(); 17 long mis = end -begin; 18 System.out.println("Spring的copier.copy耗時" + mis +"毫秒"); 19 System.out.println(testTo); 20 } 21 }View Code
總結:這四種方式的效率是由低到高。(註意Apache的PropertyUtils不能進行類型轉換的問題)