java對象屬性復制的幾種方式


1.使用java反射機制,獲取對象的屬性和get、set方法進行復制;

2.使用spring-beans5.0.8包中的BeanUtils類

import org.springframework.beans.BeanUtils;

SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanUtils.copyProperties(sourceObject, targetObject);

3.使用cglib3.2.8包中的net.sf.cglib.beans.BeanCopier類

import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);--第三個參數表示是否使用轉換器,false表示不使用,true表示使用
Converter converter = new CopyConverter();--自定義轉換器
beanCopier.copy(sourceObject, targetObject, converter);

轉換器(當源對象屬性類型與目標對象屬性類型不一致時,使用轉換器):
import net.sf.cglib.core.Converter;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Date;

/**
* Created by asus on 2019/7/12.
*/
public class CopyConverter implements Converter {

@Override
public Object convert(Object value, Class target, Object context) {
{
String s = value.toString();
if (target.equals(int.class) || target.equals(Integer.class)) {
return Integer.parseInt(s);
}
if (target.equals(long.class) || target.equals(Long.class)) {
return Long.parseLong(s);
}
if (target.equals(float.class) || target.equals(Float.class)) {
return Float.parseFloat(s);
}
if (target.equals(double.class) || target.equals(Double.class)) {
return Double.parseDouble(s);
}
if(target.equals(Date.class)){
while(s.indexOf("-")>0){
s = s.replace("-", "/");
}
return new Date(s);
}
if(target.equals(BigDecimal.class)){
if(!StringUtils.isEmpty(s)&&!s.equals("NaN")){
return new BigDecimal(s);
}
}
return value ;

}
}
}


4.使用spring-core5.0.8包中的org.springframework.cglib.beans.BeanCopier類(用法與第三種一樣)

import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
Converter converter = new SpringCopyConverter();
BeanCopier beanCopier = BeanCopier.create(SourceObject.class, TargetObject.class, true);
beanCopier.copy(sourceObject, targetObject, converter);

經過循環復制測試(源對象與目標對象各160個屬性):

第一種:Java反射通過判斷屬性類型,常用類型的屬性值都能復制,但是不優化的前提下效率最慢;

第二種:屬性類型不同時無法復制,且效率相對較慢;

第三種:耗時最少,不使用轉換器時,屬性類型不同時無法復制,使用轉換器后,耗時會相對變長;

第四種:與第三種相似,但是耗時相對較長;

 

參考博客:https://blog.csdn.net/xiaoyang226/article/details/81939912
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM