使用Java反射将一个对象复制到另一个对象
发布时间:2025-05-14 06:43:00 发布人:远客网络
一、使用Java反射将一个对象复制到另一个对象
1、在开发过程中,我们时常需要将一个对象的属性复制到另一个对象。最常见的做法是逐个属性地调用get和set方法。然而,这种方法显得繁琐且易出错。为解决这一问题,可以使用诸如BeanUtils.copyProperties方法或Spring和Apache提供的工具类。这两种方法操作简便,只需确保调用时源对象和目标对象的顺序正确。
2、BeanUtils.copyProperties方法和Spring提供的工具类都能实现对象的浅拷贝。浅拷贝意味着复制引用数据类型的属性时,只是复制了指向原对象的引用,而不是新建实例。因此,修改一个对象的引用类型属性时,另一个对象的相应属性也会受到影响。使用Spring提供的工具类通常更便捷,性能也相对更好,因此推荐优先使用。
3、除了上述方法,还有一种基于特定条件的手动实现对象复制的方式。这种方法适用于对象属性复杂,且需要额外处理的情况。在复制时,如果源对象的属性是Object类型,目标对象的相应属性可能会被自动转为String类型。为避免此类情况,可自行编写代码进行处理,以确保数据的正确性和一致性。
4、无论采用哪种方法,关键在于理解其特性与限制,以确保在具体场景下实现正确的数据复制。对于简单的属性复制需求,推荐使用BeanUtils.copyProperties方法或Spring的工具类,它们简洁高效,降低了代码出错的风险。
二、mybatis的反射工具类—MetaObject(反射对象类)
MeatObject是Mybatis的工具类,通过MetaObject获取和设置对象的属性值。
当调用 SystemMetaObject获取 MetaObject对象时,每次均 new DefaultReflectorFactory()了一个反射工厂类。
这个类并没有做很复杂的操作,就是获取object的type类型,且存储到Map中。当同一个object调用 forObject()时,后续调用可以在缓存中获取反射对象。
但注意: SystemMetaObject方法因为每次均new了一个新的 DefaultReflectorFactory工厂。若每次在方法中调用 SystemMetaObject.forObject获取 MetaObject对象。同一个对象可能不会走缓存。
推荐做法:将 DefaultReflectorFactory声明为静态变量:
在创建 MetaObject对象的时候,就会将传入的Object对象的所有反射对象都缓存起来。后续调用 metaObject.setValue等方法时,直接在缓存中获取到反射对象,然后执行反射操作。
创建MetaObject对象时,选择不同的Wrapper进行包装。
以普通的pojo为例,创建 BeanWrapper对象,在 forClass方法中会遍历object的所有方法。获取反射对象。
到达此处,判断缓存中是否存在某对象的解析结果:
注意: MetaObject.forObject会将object结果缓存起来,后续在使用MetaObject.forObject创建对象时,直接在缓存中获取。
若没有存在,则调用 new Reflector(type);去创建cache对象。
2.删除方法的前缀,获取属性名:
3. key为属性名,value是集合:
4.将局部变量放入到属性集合中:
三、Java学习路线
根据个人实际的经历,结合多种书籍,特别整理出了下面的java学习路线:
1、java基础:基础语法;面向对象(重点);集合框架(重点);常见类库API;
2、java界面编程:AWT;事件机制;Swing;
3、java高级知识:Annotation;IO和NIO、AIO;多线程、线程池;阻塞、非阻塞、异步网络通信;反射、动态代理;
4、SQL基础:基础SQL语句;基本查询;多表查询;子查询;结果集的交、并、差运算;
5、JDBC基础:常见数据库用法;JDBC操作常见数据库;RowSet与离线结果集;数据库连接池;事务管理、批处理;
6、JDBC进阶:存储过程、函数;触发器;理解JCBC的不足;掌握ORM工具优势和设计;
7、HTML基础:基本HTML标签;常见表单标签;DIV+CSS布局;
8、JavaScript知识:javascript基本语法;javascript基本对象特征;Json语法;深刻理解javascript的动态特征;
9、Dom和事件机制:DOM操作、编程;常见浏览器事件机制;掌握用户交互技巧;
10、XML基础:XML基础规则;DTD和SCheme;XML和样式单;
11、XML进阶:DOM、SAX和JAXP;dom4j、JDOM等工具;XQuery和XQJ;基于XML的数据交换;
12、Web Service:JAX_WS2、SAAJ规范;WSDL和SOAP协议;CXF框架、拦截器;CXF整合Spring;
13、Web编程基础:Tomcat服务器;Jsp语法、EL、内置对象;Servlet API;Servlet 3.0注解;Listener和Filter;
14、Web编程进阶:自定义标签库;MVC和DAO、Servlet、标签的作用;JSTL、DisplayTag等常见标签库用法;
15、Web编程原理:请求/响应、架构;Http协议;深刻理解Jsp运行原理;掌握Web容器底层的线程池、socket通信、调用Servlet的命令模式;
16、Ajax编程:XML HttpRequest和异步请求;发送请求和处理响应;常见Ajax库(Prototype、Jquery、ExtJs、DWR)用法;结合Http协议、异步请求深入研究ajax库的设计;
17、Android基础:Android开发调试环境;Android应用结构;界面组件与界面编程;资源管理;四大组件;
18、Android中级:文件IO和SQLite;图形、图像与动画;音频、视频的录制与播放;传感器编程;GPS应用;
19、Android高级:网络编程与Web Service;OpenGL_ES 3D开发;整合Google服务;使用NDK开发;java和c相互调试;
17、Struts2:MVC与struts体系;Action和Result;国际化和标签库;文件上传、下载;类型转换和输入检验;拦截器与插件开发;
18、Hibernate:ORM与持久化映射;关系映射、继承映射;延迟加载、性能调优;HQL查询、条件查询、SQL查询;二级缓存和查询缓存;
19、Spring:IoC与Bean配置、管理;Bean生命周期;SP、EL;AOP与事务权限控制;S2SH整合开发;Spring整合Jpa;
20、JSF<选学>:MVC与JSF设计理念;托管Bean与导航模型;JSF流程与事件机制;JSF标签库;类型转换与输入检验;
21、EJB及相关技术:JNPI与RMI;会话Bean及其生命周期;IoC与EJB拦截器;JMS与MDB;会话Bean与Web Service;
22、JPA:ORM框架与JPA规范;JPA注解与常用API;JTA事务与事务管理;JPQL查询;EJB、JPA整合;
23、Java EE实践与架构:Ant+Ivy或Maven;SVN、CVS;深刻理解10种以上设计模式;掌握各种Java EE架构及各自优势;
24、Workflow:Workflow规范及功能;JBPM等workflow框架;多次重构、反复思考;大型项目经验;
25、Java EE进阶:掌握各MVC框架运行原理、能开发类似框架;掌握Spring、HiveMind、AspectJ等框架原理、能开发类似工具;掌握Hibernate、iBatis等框架原理,能开发类似工具;深入研究EJB机制、大致了解应用服务器的实现;