java属性拷贝_java对象属性复制的⼏种⽅式
1.使⽤java反射机制,获取对象的属性和get、set⽅法进⾏复制;
2.使⽤spring-beans5.0.8包中的BeanUtils类
import org.springframework.beans.BeanUtils;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
3.使⽤cglib3.2.8包中的lib.beans.BeanCopier类
import lib.beans.BeanCopier;
import Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanCopier beanCopier = ate(SourceObject.class, TargetObject.class, true);--第三个参数表⽰是否使⽤转换器,false表⽰不使⽤,true表⽰使⽤
Converter converter = new CopyConverter();--⾃定义转换器
转换器(当源对象属性类型与⽬标对象属性类型不⼀致时,使⽤转换器):
import Converter;
import org.apachemons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
/**
* Created by asus on 2019/7/12.
*/
public class CopyConverter implements Converter {
@Override
bigdecimal转换为integerpublic Object convert(Object value, Class target, Object context) {
{
String s = String();
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-core
5.0.8包中的lib.beans.BeanCopier类(⽤法与第三种⼀样) import lib.beans.BeanCopier;
import Converter;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
Converter converter = new SpringCopyConverter();
BeanCopier beanCopier = ate(SourceObject.class, TargetObject.class, true); py(sourceObject, targetObject, converter);
经过循环复制测试(源对象与⽬标对象各160个属性):
第⼀种:Java反射通过判断属性类型,常⽤类型的属性值都能复制,但是不优化的前提下效率最慢;
第⼆种:属性类型不同时⽆法复制,且效率相对较慢;
第三种:耗时最少,不使⽤转换器时,属性类型不同时⽆法复制,使⽤转换器后,耗时会相对变长;第四种:与第三种相似,但是耗时相对较长;