java对象拷贝——PropertyUtils.copyProperties()用法和性能

简介:

BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

使用PropertyUtils.copyProperties()拷贝一个bean中的属性到另一个bean中,第一个参数是目标bean,第二个参数是源bean。

 
例一
Book srcBook = new Book();
srcBook.setName("Java");
Book destBook = new Book();
PropertyUtils.copyProperties(destBook, srcBook);
System.out.println(destBook.getName());
 
 
例二(对删除的数据进行备份)
Student s = new Student();
s.setName("xy")
................
StudentBak sbak = new StudentBak();
PropertyUtils.copyProperties(sbak , s);
StudentBakDao.save(sbak);
StudentDao.delete(s);
 
没有PropertyUtils.copyProperties,我们只能
StudentBak sbak = new StudentBak();
sbak.setName(s.getName);
.........................
如果有是十个属性,我们不是累呆了。


该方法做对象的拷贝很方便,但是它的性能问题相当差
 
看下面的测试代码:
public class A
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}

import org.apache.commons.beanutils.PropertyUtils;

public class PropertyUtilsTest
{
public static void main(String []args)
{

 

普通的copy,每个字段拷贝

A a1 = new A();
a1.setName("wang");

A a2 = new A();

long b = new java.util.Date().getTime();
a2.setName(a1.getName());

long e = new java.util.Date().getTime();

System.out.println("time1="+(e-b));
 
try
{
PropertyUtils.copyProperties方法copy
A a3 = new A();
b = new java.util.Date().getTime();
PropertyUtils.copyProperties(a3, a1);
e = new java.util.Date().getTime();
System.out.println("time2="+(e-b));

}
 
catch (Exception e1)
{
e1.printStackTrace();
}
}
}

最后输出:

time1=0
time2=265
 
两种方法时间差那么多!
 
 

目录
相关文章
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
281 0
|
2月前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
70 3
|
2月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
313 114
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
126 8
|
3月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
234 6
|
3月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
194 3
|
4月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
4月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
185 4
|
4月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
55 0
|
4月前
|
Cloud Native 前端开发 Java
WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究
本文深入探讨了WebAssembly与Java的结合方式,介绍了编译Java为Wasm模块、在Java中运行Wasm、云原生集成等技术方案,并通过金融分析系统的应用实例展示了其高性能、低延迟、跨平台等优势。结合TeaVM、JWebAssembly、GraalVM、Wasmer Java等工具,帮助开发者提升应用性能与开发效率,适用于Web前端、服务器端及边缘计算等场景。
143 0