java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。
注意:使用时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复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。的更多相关文章
- java中String s = new String("abc")创建了几个对象?
答案是两个,现在我们具体的说一下: String s = new String("abc");一.我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变 ...
- Java 判断两个对象是否相等
一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() ...
- Java基础(六)判断两个对象相等:equals、hashcode、toString方法
1.equal方法 Object类中的equal方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.然 ...
- Java中如何判断两个对象是否相等(Java equals and ==)
原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解 ...
- 两个对象用equals方法比较为true,它们的Hashcode值相同吗?
两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...
- 两个对象值相同(x.equals(y)==true),但却可有不同的hashcode这句话对吗?
1.这句话当然不对啦,请参看官方文档给出的解释! hashCode public int hashCode()返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtab ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- java中两个对象间的属性值复制,比较,转为map方法实现
package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...
- Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组
类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...
随机推荐
- sql server C#操作。原文在收藏页面
C#操作SQL Server数据库 1.概述 2.连接字符串的写法 3.SqlConnection对象 4.SqlCommand对象 5.SqlDataReader对象 6.DataSet对象 7 ...
- 08 SSM整合案例(企业权限管理系统):10.权限关联与控制
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 10.权限关联与控制 1.用户 ...
- BurpSuite详解
转载自:http://www.nxadmin.com/tools/689.html 本文由阿德马翻译自国外网站,请尊重劳动成果,转载注明出处 Burp Suite是Web应用程序测试的最佳工具之一,其 ...
- 【pwnable.kr】 shellshock
pwnable从入门到放弃,第五题. ssh shellshock@pwnable.kr -p2222 (pw:guest) 这题主要涉及了一个关于bash的CVE漏洞. 首先还是下载源代码审计一下, ...
- bzoj 1009GT考试
做了上一道题,全程懵逼,再做这一道,,,23333继续 貌似那些东西都是差不多的.(参见cf621E) 这个为什么b[][]+=1很困惑,为什么不是从b[-1][??]转移的呢?想了一下,因为每一次都 ...
- Canvas绘制水波进度加载
效果: 用到图片下载: 自定义View: package com.czm.mysinkingview; import android.content.Context; import android.g ...
- Citrix 更新Vcenter 地址
背景:Vcenter崩溃,重新部署了一套,还是使用原有的IP地址,部署完成后Citrix无法发布虚拟机 解决方案 1.Web访问Vcenter提示证书报错,安装证书,位置计算机>个人2.以管理员 ...
- 全局唯一性ID生成方法小结
全局ID通常要满足分片的一些要求:1 不能有单点故障.2 以时间为序,或者ID里包含时间.这样一是可以少一个索引,二是冷热数据容易分离.3 可以控制ShardingId.比如某一个用户的文章要放在同一 ...
- Elasticsearch分布式搜索
ElasticSearch之介绍 一 Elasticsearch产生背景 1.1 大规模数据如何检索 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1 ...
- windows下关闭自动更新方法
第一种方法: 1.windows+R键打开运行窗口,输入services.msc 2.找到windows update服务右键属性 第二种方法 Win键+R键在弹出的运行对话框中输入gpedit.ms ...