一、关于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,提高你的开发效率的更多相关文章

  1. C#(Net)软件开发常用工具汇总,提高你的开发效率

    C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...

  2. 提高myEclipse的开发效率和外观,这些你都设置了吗?

    [前言] 为什么我的myeclipse开启速度那么慢,为什么别人能哗啦啦几个快捷键打出一片代码?刚开始使用myeclipse的时候,相信大家都有这个疑问,慢慢的,也懂得一些配置,我也不例外,在此,把常 ...

  3. 提高php开发效率的9大代码片段

    在网站开发中,我们都期望能高效快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是极好的.php开发福利来了,今天小编就将为大家分享9大超实用的.可节省大量开发时间的php代码片段. ...

  4. 合理使用webpack提高开发效率

    虽然公司有提供现成的脚手架工具,但是作为开发人员懂得必要的相关知识还是很重要的.这样有利于提高我们的开发效率,优化我们的代码. 关于npm scripts 什么是npm scripts npm 允许在 ...

  5. IntelliJ Idea 常用10款插件(提高开发效率)

    出自:https://blog.csdn.net/weixin_41846320/article/details/82697818 插件安装方式: 1.Background Image Plus 这款 ...

  6. 30 个极大提高开发效率超级实用的 VSCode 插件

    Visual Studio Code 的插件对于在提升编程效率和加快工作速度非常重要.这里有 30 个最受欢迎的 VSCode 插件,它们将使你成为更高效的搬砖摸鱼大师.这些插件主要适用于前端开发人员 ...

  7. 如何利用 Visual Studio 自带工具提高开发效率

    Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...

  8. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  9. 善用VS中的Code Snippet来提高开发效率

    http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...

随机推荐

  1. 2020-07-21:简述redis主从同步的过程。

    福哥答案2020-07-21: 1.从服务发送一个sync同步命令给主服务要求全量同步.2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成 ...

  2. CSDN新版Markdown编辑器(Alpha 2.0版)

    Markdown编辑器 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建 ...

  3. C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3720 访问. 在MATLAB中,有一个非常有用的函数 resha ...

  4. Linux下如何高效切换目录?

    Linux 下对于目录的切换,大家肯定会想到一个命令:cd 命令.这个是 Linux 下再基本不过的命令,如果这个命令都不知道的话,赶紧剖腹自尽去吧. cd 命令确实很方便,但如果需要频繁在下面的目录 ...

  5. 第三章 kubernetes核心原理

    kubernetes API Server 提供了Kubernetes各类资源对象(如pod,re,service等)的增删改查及watch等Http Rest接口,成为集群内各个功能模块之间数据交互 ...

  6. 自绘引擎时代,为什么Flutter能突出重围?

    导语 | Flutter 框架是当下非常热门的跨端解决方案,能够帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面等多端开发.但仍然有很多产品.设计.甚至开发同学并不了解 Flut ...

  7. 一线大厂工程师推荐:Mysql、Springboot、JVM、Spring等面试合集

    前两天晚上,正当我加班沉浸在敲代码的快乐中时,听到前桌的同事在嘀咕:Spring究竟是如何解决的循环依赖? 这让我想起最开始学Java的时候,掌握了一点基本语法和面向对象的一点皮毛.当时心里也是各种想 ...

  8. (趣味哈哈镜)JMF中摄像头相关的问题

    JMF已经非常古老了.最近由于做实验的需要,不得不使用JMF处理视频.开发使用win10系统和eclipse.使用中的问题如下: 1.首先想要使用JMF需要必须安装32位JDK,同时编译软件也需要是3 ...

  9. char **指针动态分配地址空间

    1. 定义char **类型变量,初始化为NULL 2. 分配行指针数组空间 3. 为每行分配空间 4. 释放每行的空间 5. 释放二维指针 void main() { char **pointer= ...

  10. Java mysql数据库连接Demo1

    public class MysqlUtil { /** * 链接数据库 */ /** * 方法一: * 加载驱动的方法不止一种,但这种最常用 */ public static Connection ...