反射
使用Java的反射机制,获取对象的属性和get、set方法进行复制。
org.springframework.beans.BeanUtils
使用Spring-beans 5.0.8包中的org.springframework.beans.BeanUtils类
import org.springframework.beans.BeanUtils;
SourceObject sourceObject = new SourceObject();
TargetObject targetObject = new TargetObject();
BeanUtils.copyProperties(sourceObject, targetObject);
net.sf.cglib.beans.BeanCopier
使用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;
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;
}
}
}
org.springframework.cglib.beans.BeanCopier
使用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);
速度对比: