注意:使用时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 ...
随机推荐
-
【转载】MVC使用HandleErrorAttribute自定义异常
本文导读:在ASP.NET MVC中,可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特 ...
-
Swift3.0语言教程字符串与URL的数据转换与*转换
Swift3.0语言教程字符串与URL的数据转换与*转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与*转换,字符串中的字符永久保存除了可以 ...
-
【CodeForces 651B】Beautiful Paintings 排序+贪心
题目大意: 给定集合,对于任意一个的排列,记,求. 很明显每次搞出一个长度为的最长上升序列,然后把元素给删掉,答案增加. 直接暴力需要. 但是可以进行优化. 设有个,将个数从小到大排序,记为长度为的数 ...
-
文章3说话 微信商城云server创建后台
一个. 应用server资源 想要进行微信开发.少不了后台server端程序的开发,那么我们首先就要申请server资源.眼下有非常多云server可选,比方新浪的sae ...
-
常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...
-
MFC鼠标单击截获鼠标双击事件,且无法记录单击的数据的解决方案
遇到的问题: 鼠标点击会截断鼠标双击的事件,无法保存椭圆的数据.也就是说双击执行的过程是OnLButtonDown,OnLButtonUp,OnLButtonDblClk,OnLButtonUp.并不 ...
-
docker学习笔记(二)-dockerfile docker仓库
dckerfile2这样写才对,不然打印的是hello $name 例子 登陆https://hub.docker.com 上面是提交到公共仓库 创建本地私有仓库 开启另外一个虚机,将重新构建上传镜像 ...
-
.net core安装及初体验
.net core安装及初体验 .net core 作为微软的新一代技术,在开发跨平台.微服务等方面有很大的优势,也更贴近现代的编码习惯.在2.0版发布很久以后,近期终于决定进行学习和体验. 安装 作 ...
-
c++中常见概念、关键字等的区别
(1).重载,覆盖和隐藏的区别: 重载主要是函数的重载,函数名相同,返回类型相同,但是函数形参不同,被调用时,根据函数形参决定调用原函数还是重载函数. 覆盖主要用在继承多态中,函数前加virtual关 ...
-
Find the duplicate Number (鸽巢原理) leetcode java
问题描述: Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive ...