java通过反射拷贝两个对象的同名同类型变量
深拷贝和浅拷贝
首先对象的复制分为深拷贝和浅拷贝,关于这两者的区别,简单来说就是对于对象的引用,在拷贝的时候,是否会新开辟一块内存,还是直接复制引用。
两者的比较也有很多,具体可以看这篇文章: http://blog.csdn.net/zhangjg_blog/article/details/18369201
常用方法
这些只是目前我知道了,当然可能还有更多
org.apache.commons.lang3.SerializationUtils#clone
这个是通过序列化的方式,将两个相同类型的对象进行拷贝。 这里是深拷贝org.apache.commons.beanutils.BeanUtils#copyProperties
org.apache.commons.beanutils.PropertyUtils#copyProperties
org.springframework.beans.BeanUtils#copyProperties
关于这些的效率问题,可以看这篇文章: http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html
本文
这里要说的是关于两个对象,将对象1的同类型同变量名的变量赋值到对象2上。
关于为什么要做这件事情
遇到了一个特别傻逼的事情,从数据库里面读表,然后一个接口是DO1,一个接口是DO2, 两个DO中的变量名基本相同,然后需要统一两个DO,也就是将DO1中的同名变量的值赋给DO2。
思路
这边是用的浅拷贝,思路其实很简单:
- 通过反射获取DO1中的所有变量
- 遍历DO1中的变量,判断在DO2中是否存在
- 如果存在,而且是相同类型,则进行赋值
代码
public static void copyByName(Object src, Object target) {
if (src == null || target == null) {
return;
}
try {
Map<String, Field> srcFieldMap= getAssignableFieldsMap(src);
Map<String, Field> targetFieldMap = getAssignableFieldsMap(target);
for (String srcFieldName : srcFieldMap.keySet()) {
Field srcField = srcFieldMap.get(srcFieldName);
if (srcField == null) {
continue;
}
// 变量名需要相同
if (!targetFieldMap.keySet().contains(srcFieldName)) {
continue;
}
Field targetField = targetFieldMap.get(srcFieldName);
if (targetField == null) {
continue;
}
// 类型需要相同
if (!srcField.getType().equals(targetField.getType())) {
continue;
}
targetField.set(target,srcField.get(src));
}
}catch (Exception e) {
// 异常
}
return ;
}
private static Map<String, Field> getAssignableFieldsMap(Object obj) {
if (obj == null) {
return new HashMap<String, Field>();
}
Map<String, Field> fieldMap = new HashMap<String, Field>();
for (Field field : obj.getClass().getDeclaredFields()) {
// 过滤不需要拷贝的属性
if (Modifier.isStatic(field.getModifiers())
|| Modifier.isFinal(field.getModifiers())) {
continue;
}
field.setAccessible(true);
fieldMap.put(field.getName(), field);
}
return fieldMap;
}
java通过反射拷贝两个对象的同名同类型变量的更多相关文章
- java利用反射交换两个对象中的字段相同的字段值
有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值 然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐. 这时候利用反射解决这个问题. c ...
- Java 使用反射拷贝对象一般字段值
在<Java解惑>上面看到第八十三例--诵读困难者,要求使用非反射实现单例对象的拷贝.查阅了部分资料,先实现通过反射拷贝对象. 1. 编写需要被拷贝的对象Person package co ...
- Java中如何判断两个对象是否相等(Java equals and ==)
原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解 ...
- 068、Java面向对象之声明两个对象
01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...
- java 通过反射获取和设置对象属性值
public static Object parseDate(Object object){ SimpleDateFormat sdf = new SimpleDateFormat("yyy ...
- [转]C#利用反射实现两个类的对象之间相同属性的值的复制
本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0) 阅读目录 为什么要克隆? 如何实现克隆 浅克 ...
- Java中对比两个对象中属性值[反射、注解]
在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...
- 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...
随机推荐
- loadrunner 运行场景-场景运行原理
运行场景-场景运行原理 by:授客 QQ:1033553122 运行原理 1 Remote Agent Dispatcher(Process) 运行Controller在负载机上开启应用程序. 2 ...
- loadrunner 场景设计-添加Windows Resources计数器
场景设计-添加Windows Resources计数器 by:授客 QQ:1033553122 目的 监控要测试的windows服务器的资源使用情况 步骤 1.添加视图,方法双击.拖动左侧的Windo ...
- python第四十三天--第三模块考核
面向对象: 概念:类,实例化,对象,实例 属性: 公有属性:在类中定义 成员属性:在方法中定义 私有属性:在方法中使用 __属性 定义 限制外部访问 方法: 普通方法 类方法: @classmeth ...
- 17秋 软件工程 团队第五次作业 Alpha 用户反馈
用户反馈 Bug 测试对不同机型进行了测试,包括: 小米NOTE, MIUI 8.5 稳定版 [已修复]点登录按钮之后自动退出: [已修复]登录界面的背景图片没有显示. 小米4 [已修复]闪退,无法打 ...
- JFreeChart柱状图单组柱子的不同颜色显示
JFreeChart柱状图中单组柱子用不同颜色来显示的实现方法是自定义一个Renderer来继承BarRenderer类,然后重载getItemPaint(int i,int j)方法. 实现效果如下 ...
- luogu P3293 [SCOI2016]美味
题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...
- 原生JS添加类名 删除类名
为 <div> 元素添加 class: document.getElementById("myDIV").classList.add("mystyle&quo ...
- 深入浅出RxJava(三:响应式的好处)
在第一篇中,我介绍了RxJava的基础知识.第二篇中,我向你展示了操作符的强大.但是你可能仍然没被说服.这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava. 错误处 ...
- BZOJ1024:[SCOI2009]生日快乐(DFS)
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的 ...
- Scala 上下文界定
上下文界定的类型参数形式为T:M的形式,其中M是一个泛型,这种形式要求存在一个M[T]类型的隐式值: /** * 上下文界定 */ @Test def testOrdering_Class_Conte ...