深拷贝和浅拷贝

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

两者的比较也有很多,具体可以看这篇文章: 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. Android学习笔记----天地图API开发之UnsatisfiedLinkError

    由于在jniLibs目录下移除了x86的相关so文件,后来又因为需要在PC模拟器上调试,将该文件夹恢复后,增加了天地图的sdk,却忘记将libMapEngine.so文件同时拷贝至x86目录下,导致如 ...

  2. JavaWeb:jsp

    本文内容: JSP的介绍 jsp的使用 EL表达式 JSTL的使用 首发日期:2018-06-18 JSP的介绍: JSP全称Java Server Pages. 与静态网页格式的html不同的是,j ...

  3. JavaScript大杂烩5 - JavaScript对象的若干问题

    1. 类型检查:instanceof与typeof 这是两个相似的操作符,instanceof用于检测函数的实例类型,主要是在面向对象编程中检查new出来的对象类型,需要注意instanceof是检查 ...

  4. [20180408]那些函数索引适合字段的查询.txt

    [20180408]那些函数索引适合字段的查询.txt --//一般不主张建立函数索引,往往是开发的无知,使用trunc等函数,实际上一些函数也可以用于字段的查询.--//以前零碎的写过一些,放假看了 ...

  5. Vim命令图解及快捷键讲解

    快捷键详解

  6. [MapReduce_1] 运行 Word Count 示例程序

    0. 说明 MapReduce 实现 Word Count 示意图 && Word Count 代码编写 1. MapReduce 实现 Word Count 示意图 1. Map:预 ...

  7. input 属性radio中设置checked 不生效

    同一个页面中有许多地方都用到了单选按钮并设置了默认选中 , 结果在运行的时候发现单选按钮没有被默认选中 由于是复制然后修改个别属性 ,然后直接使用的 , 所以name值忘记修改了 , 单选框是根据na ...

  8. Django之ORM查询复习与cookie

    ORM查询总结: models.Book.objects.filter(**kwargs): querySet [obj1,obj2] models.Book.objects.filter(**kwa ...

  9. (11)Python包

  10. flare-spork: 自己维护的Pig on Spark项目

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zbf8441372/article/details/24726501 关于flare-spork 非 ...