注意:使用时copy()方法只会复制相同的属性。常用的copy()方法。以下为封装的工具和使用方式。

1.封装类

import java.util.Map;

import java.util.WeakHashMap;

import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
public class BeanCopyUtils {
// 使用WeakHashMap缓存,在内存不足时会自动释放
private final static Map<String, BeanCopier> BEAN_COPIER_MAP = new WeakHashMap<>();
private final static Map<String, Converter> CONVERTER_MAP = new WeakHashMap<>();
private static Object lock1 = new Object();
private static Object lock2 = new Object();

private BeanCopyUtils() {
}

/**
* 创建BeanCopier,并缓存
*
* @param src
* @param target
* @param useConverter
* @return
*/
private static BeanCopier getBeanCopier(Object src, Object target, boolean useConverter) {
String key = generateKey(src, target, useConverter);
BeanCopier bc = BEAN_COPIER_MAP.get(key);
if (null == bc) {
synchronized (lock1) {
bc = BEAN_COPIER_MAP.get(key);
if (null == bc) {
bc = BeanCopier.create(src.getClass(), target.getClass(), useConverter);
BEAN_COPIER_MAP.put(key, bc);
System.out.println("Create BeanCopier with key:" + key);
}
}
}
return bc;
}

/**
* 复制对象属性
*
* @param src
* @param target
*/
public static void copy(Object src, Object target) {
BeanCopier bc = getBeanCopier(src, target, false);
bc.copy(src, target, null);
}

/**
* 使用自定义的属性转换器复制对象属性
*
* @param src
* @param target
* @param converter
*/
public static void copy(Object src, Object target, Converter converter) {
BeanCopier bc = getBeanCopier(src, target, true);
bc.copy(src, target, converter);
}

/**
* 对象属性复制,只复制fields中指定的属性,每个属性用逗号分隔
*
* @param src
* @param target
* @param fields
*/
public static void copyWithFields(Object src, Object target, final String fields) {
BeanCopier bc = getBeanCopier(src, target, true);
bc.copy(src, target, newConverter(src, target, fields, true));
}

/**
* 对象属性复制,排除指定属性
*
* @param src
* @param target
* @param fields
*/
public static void copyWithoutFields(Object src, Object target, final String fields) {
BeanCopier bc = getBeanCopier(src, target, true);
bc.copy(src, target, newConverter(src, target, fields, false));
}

/**
* new属性转换器,
*
* @param fields
* 需要复制或排除的属性
* @param fieldCopyFlag
* 属性复制标识 true:表明fields为需要复制的属性;false:表明fields是需要排除复制的属性
* @return
*/
private static Converter newConverter(Object src, Object target, final String fields, final boolean fieldCopyFlag) {
String key = buildConverterkey(src, target, fields, fieldCopyFlag);
Converter converter = CONVERTER_MAP.get(key);
if (null == converter) {
synchronized (lock2) {
converter = CONVERTER_MAP.get(key);
if (null == converter) {
converter = new Converter() {
@Override
public Object convert(Object fieldValue, Class fieldType, Object methodName) {
String field = methodName.toString().substring(3); // 得到属性名,如Name
field = field.substring(0, 1).toLowerCase() + field.substring(1); // 将首字母小写
if ((fieldCopyFlag && fields.contains(field))
|| (!fieldCopyFlag && !fields.contains(field))) {
return fieldValue;
}
return null;
}
};
CONVERTER_MAP.put(key, converter);
System.out.println("Created Converter with key:" + key);
}
}
}
return converter;
}

private static String generateKey(Object src, Object target, boolean useConverter) {
return src.getClass().getName() + target.getClass().getName() + String.valueOf(useConverter);
}

private static String buildConverterkey(Object src, Object target, String fields, boolean copyFlag) {
String baseKey = generateKey(src, target, true);
String key = baseKey + fields + String.valueOf(copyFlag);
return key;
}

}

2.使用实例

FileCabinet fb = list.get(i);
FileCabinetReturn fbReturn = new FileCabinetReturn();
BeanCopyUtils.copy(fb, fbReturn);

java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。的更多相关文章

  1. java中String s = new String("abc")创建了几个对象?

    答案是两个,现在我们具体的说一下: String s = new String("abc");一.我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变 ...

  2. Java 判断两个对象是否相等

    一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() ...

  3. Java基础(六)判断两个对象相等:equals、hashcode、toString方法

    1.equal方法 Object类中的equal方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.然 ...

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

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

  5. 两个对象用equals方法比较为true,它们的Hashcode值相同吗?

    两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...

  6. 两个对象值相同(x.equals(y)==true),但却可有不同的hashcode这句话对吗?

    1.这句话当然不对啦,请参看官方文档给出的解释! hashCode public int hashCode()返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtab ...

  7. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  8. java中两个对象间的属性值复制,比较,转为map方法实现

    package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...

  9. Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组

    类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...

  10. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

随机推荐

  1. SQL Server 语法大全

    SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...

  2. javaweb利用ajax使登录窗口不跳转页面实现对账号密码的判断

    和上一篇判断用户名是否被占用不跳转页面类似!利用ajax实现跳转,要导入jquery文件库!具体代码我会贴出来,注释在里面!!可以观摩一手!(代码我也留下链接,如果失效,评论补发,代码可能导入也无法使 ...

  3. 在登陆退出时候使用Vuex

    1.登陆的时候,在登陆模块请求接口,然后获取一个access_token,获取用户权限.保存到缓存里面. 2.退出的时候,请求退出接口,把缓存里面的access_token清除. 一旦要在登陆里面做一 ...

  4. Distributed--2PC和3PC

    参考 https://blog.csdn.net/lnho2015/article/details/78685503 https://www.cnblogs.com/hubaoxi/p/6867203 ...

  5. 关于GAN的一些笔记

    目录 1 Divergence 1.1 Kullback–Leibler divergence 1.2 Jensen–Shannon divergence 1.3 Wasserstein distan ...

  6. Spring Boot without the web server

    https://stackoverflow.com/questions/26105061/spring-boot-without-the-web-server/28565277 1. spring.m ...

  7. Android自定义View——简单实现边缘凹凸电子票效果

        View继承LinearLayout,在View的上下边缘画出白色的圆形即可,这里只要计算出圆的个数和圆的循环规律即可,下面请看分析 我们取卡片的前2个凹凸来看,将其分为四部分,并且两部分为循 ...

  8. Django项目同步到码云

    本篇博客主要记录下将刚刚初始化后的Django项目部署到码云中,首先我们需要到码云中注册一个账号,下面会讲解下如何在码云中建立一个仓库,再将其克隆到本地.最后将本地的项目推送到码云的仓库中. 码云内初 ...

  9. 关于Vue element-ui中诡异问题的解决思路

    最近在做Element-ui项目时总是会出现些异步及其一些诡异问题,关于vue 的异步原理就不多说了,感觉大部分的问题都可以用Vue.nextTick来解决,Vue.nextTick是等DOM二次加载 ...

  10. solr8.0.0基本安装和在springboot中的基本使用(win10)

    1.下载solr 下载地址:http://archive.apache.org/dist/lucene/solr/ 该地址可以也可以下载以前的版本,我这边下载的solr-8.0.0.zip版本.下载完 ...