随笔 - 178  文章 - 2  评论 - 0  阅读 - 99381

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

posted on   渐行渐远的那些人  阅读(25964)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示