学会使用BeanUtils,提高你的开发效率
一、关于BeanUtils
一说到BeanUtils,大家可能不清楚指的哪个BeanUtils。因为它在很多包里面都有,其中挺常用的就是
(1)org.apache.commons.beanutils.BeanUtils
(2)org.springframework.beans.BeanUtils
这两者有什么区别呢?
(1)类的性质不同
apache:

springframework:

apache的是普通类,springframework的是抽象类。
(2)部分相同方法使用方式不同
名字相同,方法名称相同,参数类型和个数都相同,需要实现的功能也一样,但结果大相径庭。
举例:copyProperties (用来在对象之间复制属性值)
apache:

springframework:

眼尖的伙伴已经注意到了,apache的第一个参数是目标对象,第二个是源对象;springframework的第一个参数是源对象,第二个是目标对象。所以大家在开发的时候一定要注意引用的是哪个包。
二、根据已有方法扩展
因为开发的时候有很多类的属性都要重设值,很多时候大把的get、set方法占用你的篇幅与时间,导致拉低开发效率。
所以在此扩展了一些经常用到的方法,供大家参考。
1. 使用org.apache.commons.beanutils.BeanUtils.populate方法
意为将Map中的数据封装到实体类。
扩展之后可以将Map中的数据封装到实体类,并支持日期格式的转换。
/**
* 以Map的key和实体的字段名称为对应,复制Map中的值到实体中
*
* @param target 目标对象
* @param params Map
* @return T
*/
public static <T> T copyFields(T target, Map<String, Object> params) {
if(null == params || params.isEmpty()) {
return target;
}
try {
org.apache.commons.beanutils.BeanUtils.populate(target, params);
} catch (IllegalAccessException | InvocationTargetException e) {
LOGGER.error(e.getMessage(), e);
}
return target;
}
注意:遇到日期类型不能转换,所以需要自己手动注册一个时间转换器。
这里是在静态代码块里面注册的,将格式为yyyy-MM-dd的字符串转换成Date类型。
static {
// 注册BeanUtils转换器
ConvertUtils.register(new Converter() {
@SuppressWarnings("rawtypes")
public Object convert(Class type, Object value) {
try {
return DateUtils.parseDate(String.valueOf(value), "yyyy-MM-dd");
} catch (ParseException e) {
LOGGER.error(e.getMessage(), e);
}
return null;
}
}, Date.class);
}
2、使用org.springframework.beans.BeanUtils.getPropertyDescriptors方法
意为获取类的属性描述器
扩展之后可以从一个实体中复制非空字段的值到另一个实体中。
/**
* 以字段名称为关系,从一个实体中复制非空字段的值到另一个实体中
*
* @param target 目标实体
* @param source 源实体
* @return T
*/
public static <T, S> T copyNotNullFields(T target, S source) {
Map<String, Object> params = getFiledValues(source, o -> (o != null));
T newTarget = copyFields(target, params);
return newTarget;
}
这里可以根据对属性值的判断,将符合条件的属性与其值封装成Map。
/**
* 读取实体,以实体字段名为key,值为value,并将满足条件的value封装成一个Map
*
* @param obj 源实体
* @param predicate 条件
* @return Map<String, Object>
*/
public static Map<String, Object> getFiledValues(Object obj, Predicate<Object> predicate) {
if(null == obj) {
return Collections.emptyMap();
}
Map<String, Object> map = Maps.newHashMap();
Arrays.asList(org.springframework.beans.BeanUtils.getPropertyDescriptors(obj.getClass())
.stream()
.filter(o -> !o.getName().equals("class"))
.forEach(o ->
{
String propertyName = o.getName();
Method readMethod = o.getReadMethod();
try {
Object propertyValue = readMethod.invoke(obj);
if(predicate.test(propertyValue)) {
map.put(propertyName, propertyValue);
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
LOGGER.error(e.getMessage(), e);
}
});
return map;
}
三、心得
在开发时,如果经常在一些重复性的,且不必要的地方浪费时间时,那就要想一下方法来避免了,因为这会拉低你的开发效率。
首先自己要思考,怎样才能去很好的解决。如果不能解决,那可以参考已有的解决方案(面向各大搜索引擎编程),学习他们解决问题的思路,看自己能不能活学活用。
然后可以对已有的轮子进行一些自己的优化与封装,使得更加的符合自己的业务场景。
学会使用BeanUtils,提高你的开发效率的更多相关文章
- C#(Net)软件开发常用工具汇总,提高你的开发效率
C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...
- 提高myEclipse的开发效率和外观,这些你都设置了吗?
[前言] 为什么我的myeclipse开启速度那么慢,为什么别人能哗啦啦几个快捷键打出一片代码?刚开始使用myeclipse的时候,相信大家都有这个疑问,慢慢的,也懂得一些配置,我也不例外,在此,把常 ...
- 提高php开发效率的9大代码片段
在网站开发中,我们都期望能高效快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是极好的.php开发福利来了,今天小编就将为大家分享9大超实用的.可节省大量开发时间的php代码片段. ...
- 合理使用webpack提高开发效率
虽然公司有提供现成的脚手架工具,但是作为开发人员懂得必要的相关知识还是很重要的.这样有利于提高我们的开发效率,优化我们的代码. 关于npm scripts 什么是npm scripts npm 允许在 ...
- IntelliJ Idea 常用10款插件(提高开发效率)
出自:https://blog.csdn.net/weixin_41846320/article/details/82697818 插件安装方式: 1.Background Image Plus 这款 ...
- 30 个极大提高开发效率超级实用的 VSCode 插件
Visual Studio Code 的插件对于在提升编程效率和加快工作速度非常重要.这里有 30 个最受欢迎的 VSCode 插件,它们将使你成为更高效的搬砖摸鱼大师.这些插件主要适用于前端开发人员 ...
- 如何利用 Visual Studio 自带工具提高开发效率
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...
- 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...
- 善用VS中的Code Snippet来提高开发效率
http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...
随机推荐
- 2020-07-21:简述redis主从同步的过程。
福哥答案2020-07-21: 1.从服务发送一个sync同步命令给主服务要求全量同步.2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成 ...
- CSDN新版Markdown编辑器(Alpha 2.0版)
Markdown编辑器 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建 ...
- C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3720 访问. 在MATLAB中,有一个非常有用的函数 resha ...
- Linux下如何高效切换目录?
Linux 下对于目录的切换,大家肯定会想到一个命令:cd 命令.这个是 Linux 下再基本不过的命令,如果这个命令都不知道的话,赶紧剖腹自尽去吧. cd 命令确实很方便,但如果需要频繁在下面的目录 ...
- 第三章 kubernetes核心原理
kubernetes API Server 提供了Kubernetes各类资源对象(如pod,re,service等)的增删改查及watch等Http Rest接口,成为集群内各个功能模块之间数据交互 ...
- 自绘引擎时代,为什么Flutter能突出重围?
导语 | Flutter 框架是当下非常热门的跨端解决方案,能够帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面等多端开发.但仍然有很多产品.设计.甚至开发同学并不了解 Flut ...
- 一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集
前两天晚上,正当我加班沉浸在敲代码的快乐中时,听到前桌的同事在嘀咕:Spring究竟是如何解决的循环依赖? 这让我想起最开始学Java的时候,掌握了一点基本语法和面向对象的一点皮毛.当时心里也是各种想 ...
- (趣味哈哈镜)JMF中摄像头相关的问题
JMF已经非常古老了.最近由于做实验的需要,不得不使用JMF处理视频.开发使用win10系统和eclipse.使用中的问题如下: 1.首先想要使用JMF需要必须安装32位JDK,同时编译软件也需要是3 ...
- char **指针动态分配地址空间
1. 定义char **类型变量,初始化为NULL 2. 分配行指针数组空间 3. 为每行分配空间 4. 释放每行的空间 5. 释放二维指针 void main() { char **pointer= ...
- Java mysql数据库连接Demo1
public class MysqlUtil { /** * 链接数据库 */ /** * 方法一: * 加载驱动的方法不止一种,但这种最常用 */ public static Connection ...