深拷贝和浅拷贝

首先对象的复制分为深拷贝和浅拷贝,关于这两者的区别,简单来说就是对于对象的引用,在拷贝的时候,是否会新开辟一块内存,还是直接复制引用。

两者的比较也有很多,具体可以看这篇文章: http://blog.csdn.net/zhangjg_blog/article/details/18369201

常用方法

这些只是目前我知道了,当然可能还有更多

  1. org.apache.commons.lang3.SerializationUtils#clone

    这个是通过序列化的方式,将两个相同类型的对象进行拷贝。 这里是深拷贝

  2. org.apache.commons.beanutils.BeanUtils#copyProperties

  3. org.apache.commons.beanutils.PropertyUtils#copyProperties

  4. org.springframework.beans.BeanUtils#copyProperties

关于这些的效率问题,可以看这篇文章: http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html

本文

这里要说的是关于两个对象,将对象1的同类型同变量名的变量赋值到对象2上。

关于为什么要做这件事情

遇到了一个特别傻逼的事情,从数据库里面读表,然后一个接口是DO1,一个接口是DO2, 两个DO中的变量名基本相同,然后需要统一两个DO,也就是将DO1中的同名变量的值赋给DO2。

思路

这边是用的浅拷贝,思路其实很简单:

  1. 通过反射获取DO1中的所有变量
  2. 遍历DO1中的变量,判断在DO2中是否存在
  3. 如果存在,而且是相同类型,则进行赋值

代码

    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通过反射拷贝两个对象的同名同类型变量的更多相关文章

  1. java利用反射交换两个对象中的字段相同的字段值

    有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值 然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐. 这时候利用反射解决这个问题. c ...

  2. Java 使用反射拷贝对象一般字段值

    在<Java解惑>上面看到第八十三例--诵读困难者,要求使用非反射实现单例对象的拷贝.查阅了部分资料,先实现通过反射拷贝对象. 1. 编写需要被拷贝的对象Person package co ...

  3. Java中如何判断两个对象是否相等(Java equals and ==)

    原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解 ...

  4. 068、Java面向对象之声明两个对象

    01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...

  5. java 通过反射获取和设置对象属性值

    public static Object parseDate(Object object){ SimpleDateFormat sdf = new SimpleDateFormat("yyy ...

  6. [转]C#利用反射实现两个类的对象之间相同属性的值的复制

    本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...

  7. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  8. Java中对比两个对象中属性值[反射、注解]

    在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...

  9. 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

    java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...

随机推荐

  1. JMeter—监听器(十二)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第七节监听器用来显示JMeter取样器的测试结果,能够以树.表.图形形式显示,也可以以文件方式保存. 一.设置默 ...

  2. EF 排序扩展

    public static class LinqOrderEx { private static IOrderedQueryable<T> OrderingHelper<T>( ...

  3. ubuntu 配置拼音输入法步骤

    今天配置了一下 ubuntu 拼音,要求使用ubuntu 内置拼音.大致步骤我记录一下: 配置拼音,使用 ibus pinyin,网上有很多帖子大致步骤: 1)安装 中文语言 2)安装ibus 3)  ...

  4. oh-my-zsh安装与使用

    使用oh-my-zsh之前确保安装过zsh 通过脚本安装: sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussel ...

  5. Android中使用databinding编译时出现的error:Execution failed for task ':app:dataBindingProcessLayoutsDebug'

    Windows环境下使用svn对AndroidStudio更新代码时,总会在源文件中出现一堆乱码,尤其是xml文件中的乱码,不仅找起来费劲,改起来更费劲. 最近从svn更新代码之后,编译时出现了下面这 ...

  6. VSCode + PYQT5 + QtDesigner 环境搭建和测试

    目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...

  7. PHP 截取字符串乱码的解决方案

    今天遇到一个坑,左右调试坑的我一脸懵逼,当我们对一条字符串进行截取的时候,通常第一个想到的就是substr()函数了,但是如果是中文+数字的字符串的话,这时候使用substr进行截取就会出现乱码的问题 ...

  8. Alpha冲刺! Day5 - 砍柴

    Alpha冲刺! Day5 - 砍柴 今日已完成 晨瑶:review了业务逻辑表格,确定了工具类具体函数有哪些:讨论确定了记录的存储方式为HTML. 昭锡:继续学习Gson,并写出json基本操作的D ...

  9. ABAP设计模式——适配器

    计算机科学中的大多数问题都可以通过增加一层间接性来解决.  ——David Wheeler 适配器模式(Adapter Design Pattern),是一个广泛应用于真实世界和面向对象编程语言的设计 ...

  10. cesium相机绕点飞行

    相机绕点飞行原理就是获取相机参数与点位置信息,添加时间监听,一直去改变相机的heading,关键代码如下: function rotateHeading() { // 相机的当前heading var ...