public class BeanUtils {
private static final String DEFAULT_HYPHEN = "-";
/**
* 对象拷贝,先使用Spring的BeanUtils进行浅拷贝,再尝试拷贝属性名称相同、但类型不同的字段
*
* @param source 源对象
* @param target 目标对象
*/
public static void copyProperties(Object source, Object target) {
// 先做属性类型、属性名称都一致的基本拷贝
org.springframework.beans.BeanUtils.copyProperties(source, target);
// 尝试拷贝属性名称相同、但类型不同的字段
try {
copyPropertiesExtension(source, target);
} catch (Exception e) {
log.error("反射调用/访问方法异常", e);
throw new RuntimeException(e);
}
}
/**
* 尝试拷贝属性名称相同、但类型不同的字段
*
* @param source 源对象
* @param target 目标对象
* @throws InvocationTargetException 调用目标方法异常
* @throws IllegalAccessException 非法访问异常
*/
public static void copyPropertiesExtension(Object source, Object target) throws InvocationTargetException, IllegalAccessException {
Class<?> sourceClazz = source.getClass();
Field[] sourceFields = sourceClazz.getDeclaredFields();
Class<?> targetClazz = target.getClass();
Field[] targetFields = targetClazz.getDeclaredFields();
HashMap<String, Field> targetFieldsMap = Maps.newHashMap();
for (Field targetField : targetFields) {
targetFieldsMap.put(targetField.getName(), targetField);
}
for (Field sourceField : sourceFields) {
// 查找属性名相同字段
String sourceFieldName = sourceField.getName();
Field targetField = targetFieldsMap.get(sourceFieldName);
if (targetField != null && "class java.lang.String".equals(targetField.getType().toString())) {
targetField.setAccessible(true);
Method sourceMethod;
try {
sourceMethod = source.getClass().getMethod("get" + getMethodName(sourceFieldName));
} catch (NoSuchMethodException e) {
log.error("找不到方法", e);
throw new RuntimeException(e);
}
// 判断属性类型
String fieldType = sourceField.getType().toString();
if ("class java.lang.Double".equals(fieldType)) {
// Double转String
Double invoke = (Double) sourceMethod.invoke(source);
if (invoke != null) {
targetField.set(target, invoke.toString());
}
} else if ("class java.lang.Integer".equals(fieldType)) {
// Integer转String
Integer invoke = (Integer) sourceMethod.invoke(source);
if (invoke != null) {
targetField.set(target, invoke.toString());
}
} else if ("class java.lang.Long".equals(fieldType)) {
// Long转String
Long invoke = (Long) sourceMethod.invoke(source);
if (invoke != null) {
targetField.set(target, invoke.toString());
}
}
}
}
}
/**
* 把一个字符串的第一个字母大写、效率是最高的
*
* @param str 字符串
* @return 第一个字母转大写后的str
*/
private static String getMethodName(String str) {
byte[] items = str.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
/**
* 转换JavaBean空字段的Value
*
* @param obj obj
*/
public static void convertNullFieldValue(Object obj) {
convertNullFieldValue(obj, DEFAULT_HYPHEN);
}
/**
* 转换JavaBean空字段的Value
*
* @param obj obj
* @param str 空字段的值
*/
public static void convertNullFieldValue(Object obj, String str) {
Class<?> clazz = obj.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
if (declaredFields.length == 0) {
return;
}
for (Field field : declaredFields) {
field.setAccessible(true);
try {
if (field.get(obj) == null && "class java.lang.String".equals(field.getType().toString())) {
field.set(obj, str);
}
} catch (IllegalAccessException e) {
throw new RuntimeException();
}
}
}
}
相关推荐
在F1C100s上跑GBA游戏:手把手教你用Buildroot配置SDL和移植gpsp模拟器
本文详细介绍了在全志F1C100s开发板上配置Buildroot、移植SDL库和gpsp模拟器的完整流程,帮助开发者实现在ARM9平台上流畅运行GBA游戏。内容涵盖环境配置、交叉编译、常见问题解决及性能优化技巧,特别针对'段错误'和'无声音'等典型问题提供实用解决方案。
List<类型1>转成List<类型2>的LIst类型转换工具类
工具类代码 import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * List类型转换工具类 */ @Slf4j public class BeanHelper { public static <T> T cop
【博客汇总】UV打印机博客汇总
UV平板机博客汇总
Spring的BeanUtils工具类
BeanUtils默认使用相同名称的属性进行属性复制,如果需要自定义属性映射规则,可以使用BeanUtils提供的自定义转换器。// 自定义转换器 class CustomConverter implements Converter {// 自定义转换逻辑 return convertedValue;} } // 使用自定义转换器进行属性复制 ConvertUtils . register(new CustomConverter() , String . class);
信息流广告ROI线性预测看板&投放分析监控看板展示&数据处理入库全流程
此看板数据量太大,在tableau public部署运行速度极慢,因此用图片作展示 数据清洗
HMC7044芯片模拟SPI配置
摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。
BeanUtils工具类下copyProperties拷贝对象的用法
不管是org.springframework.beans还是org.apache.commons.beanutils,都是利用的反射机制和API的封装完成了对属性的赋值,但要注意赋值时属性名要相同以及源对象和目标对象的位置。
《AI编程实战:深度学习模型改进与系统部署》,改进专栏目录和介绍
专深度学习相关项目都写在本专栏,《一次订阅解锁全部,都有源码,永久观看》,包括车牌识别、股票预测、人脸识别、风格迁移、图像修复、图像超分辨重建、图像分割等任务,Web/PyQt系统实现。引入Transformer、Swin Transformer、DenseNet、ViT、ConvNeXt等算法实战,提供卷积改进,魔改对比实验,模型剪枝,模型蒸馏,模型量化,全网独家整合改进专栏,为不同领域的同学发表论文提供了大力支持。
常用工具类BeanUtils
BeanUtils BeanUtils的概述和简单使用 BeanUtils概述 BeanUtils是Apache commons组件的成员在之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装成一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。 需要的jar包 BeanUtils工具常用工具类有两个:BeanUtils,ConvertUtils。BeanUtils用于封装数据,ConvertUtils用于处理类型转换。 常用方法: setProperty(Ob
全网最详细的 Ubuntu 18.04 安装Livox mid-360驱动,测试 fast_lio2
Livox mid-360需要使用Livox-SDK2,而非Livox-SDK,以及对应的。并需要修改FAST_LIO中部分代码。Faster—LIO;Faster-LIO:快速激光IMU里程计。Faster-LIO:快速激光IMU里程计PDF。大部分Lidar SLAM都是基于loam进行改造的,基本上是通过线特征edge和面特征(面点)分割进行配准得到里程计的,而fast-lio2是通过一个迭代扩展卡尔曼滤波器去优化帧内位姿,然后通过输入点云与地图进行配准得到里程计,精度和鲁棒性都不错。
【立创EDA-PCB设计基础】1.嘉立创EDA专业版软件安装+PCB基本概念+原理图绘制
本文详解PCB基本概念以及实现MCU最小系统原理图的绘制(原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED)及嘉立创EDA专业版软件安装。为本专栏【立创EDA-PCB设计基础】后面章节实现PCB绘制做准备。
BeanUtils.copyProperties的用法(超详细,建议收藏)
用法 org.springframework.beans.BeanUtils,它提供了对java反射和自省API的包装。它里面还有很多工具类,这里我们介绍一下copyProperties。 我们如果有两个具有很多相同属性的JavaBean对象a和b,想把a中的属性赋值到b,比如接口中将接收到的前端请求参数封装为reqVo,dan @Data public class User { private String id; private String name; private Stri
工业相机通用SDK封装实战:C#硬件抽象层(HAL)实现多品牌无缝切换
本文介绍了一种解决工业相机SDK碎片化问题的通用解决方案。作者基于多年工业视觉项目经验,提出通过硬件抽象层(HAL)和适配器模式封装不同品牌相机的SDK差异,实现统一的相机操作接口。文章详细分析了传统直接对接SDK方式的四大痛点:接口碎片化、维护成本高、业务耦合度高和稳定性差,并给出了分层架构设计方案。该方案采用三层架构(业务层、抽象层、实现层),遵循最小接口原则和高内聚低耦合等设计理念,定义了包括触发模式、像素格式等通用枚举类型,以及图像数据结构等核心抽象。最终实现的HAL层能够支持多种品牌相机,显著降低
spring的beanutils工具类_Spring 框架BeanUtils工具类使用(1)
BeanUtils 工具类提供了非常丰富的Java反射API,开发过程中使用恰当可以减少很懂工作量。 其中最常用的莫过于copyProperties :场景设想比如有属性比较多的两个类,User.java 和 UserForm.java 它们俩有部分属性字段是一样的,但UserForm.java是对应前端表单、User.java对应数据库的实体映射,前者带的属性比较多,或者有些字段名称不一样,我现...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
对象拷贝工具类BeanUtils
常用的对象拷贝方法有三种: 1.通过set,get方法: //创建user类 public class User { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Stri
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
BeanUtils工具类的介绍和使用
目录BeanUtils工具类介绍BeanUtils工具类的使用简单的演示样例BeanUtils工具类的简要说明BeanUtils工具类外包下载链接 BeanUtils工具类介绍 BeanUtils工具类,简化数据封装 * 用于封装JavaBean的 1. JavaBean:标准的Java类 1. 要求: 1. 类必须被public修饰 2. 必须提供空参的构造器 ...
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
012、BeanUtils工具类
BeanUtils工具类,简化数据封装(注意选apache公司) 一、BeanUtils是用于封装JavaBean 1.JavaBean定义:标准的Java类(注意:我们以后我们经常会看到类似domain这样的文件夹,里面放到就是标准java类) 标准的Java类的要求如下: (1). 类必须被public修饰 (2). 必须提供空参的构造...
spring的beanutils工具类_Java工具类BeanUtils库介绍及实例详解
BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中。在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数...
【JavaWeb】BeanUtils工具类的使用
在dao层、servlet层或者其它层时,我们常常需要创建javabean对象; 而使用BeanUtils工具类可以为我们快速的创建javabean对象。举例如下:
BeanUtils 工具类
一.BeanUtils 概述 BeanUtils 是阿帕奇提供的一套专门用于将一些数据封装到java对象中的工具类; 名词:javaBean:特定格式的java类称为javaBean; 要求: 1:javaBean这个类要实现Serializable接口;(在实际开发中,通常省略了) 2:javaBean必须有public...
【JAVA】【工具类】超实用的BeanUtils工具类
摘要 本文介绍了一个高性能的BeanUtils工具类,用于处理Java对象间的属性拷贝和类型转换。该工具基于Java反射机制实现,支持对象到对象、Map到对象的属性复制,并内置常见数据类型的隐式转换功能。工具类采用缓存机制优化性能,已在多个大数据项目中验证其稳定性和扩展性。核心功能包括:对象属性复制、Map转对象、属性获取/设置等,适用于需要频繁进行对象转换的场景。
BeanUtils 工具类
BeanUtils 是用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中 运用BeanUtils工具类 1.定义水果类,属性为品种(kind),价钱(price); 2.定义测试类Test,定义Map集合,将name和age赋值,存入到Map集合,然后利用BeanUtils将数
BeanUtils工具类,基于Spring框架。
BeanUtils工具类用于高效地复制对象,使用到cglib的BeanCopier。 import org.springframework.cglib.beans.BeanCopier; import org.springframework.util.CollectionUtils; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import jav
397



被折叠的 条评论
为什么被折叠?



