一、关于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. sql 语句(精品)

    GROUP BY: select avg(latency),projectName,data_trunc('hour'm\,_time_) as hour group by projectName,h ...

  2. 同步博客到cnblogs平台

    缘由 最最开始在csdn写博客,广告太多,平台暗调资源积分,退:后来使用githubpage+jeklly搭建静态博客,感觉不错,回归到安静的敲打环境.emmmm,由于是静态博客项目,虽能最大化自定义 ...

  3. AdblockPlus自定义屏蔽广告

    AdblockPlus自定义屏蔽广告我推荐使用两种方法: 1. 使用CSS选择器 2. 使用样式选择器 屏蔽广告中,重要的一个问题就是识别广告. 我们要自己编写屏蔽就得将广告选出来,告诉Adblock ...

  4. python基本数据类型(二)

    列表   list 1.list.append( p_object) ----  增加列表参数(向后追加) list=['lifei','liuhua','laochai'] list.append( ...

  5. Python 用load_workbook 读取excel某个单元格数据、读取excel行数、列数

    from openpyxl import load_workbook path = r'D:\pywork\12' # EXCEL信息所在文件夹 e= load_workbook(path + '/' ...

  6. GitHub 热点速览 Vol.33:听说程序员都是颜控?

    作者:HelloGitHub-小鱼干 摘要:GitHub上面除了很多有趣的项目,也有很多高颜值的项目,比如:图片共享网站 Unsplash 开源的 Dataset,提供了两百多张高颜值美照.Heroi ...

  7. Jmeter 常用函数(23)- 详解 __longSum

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 计算两个或多个长值的和 注意 当值不在 ...

  8. 9.oracle表查询关键字

    1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J? select * from emp where (sal > 500 or ...

  9. MapReduce框架原理

    MapReduce框架原理 3.1 InputFormat数据输入 3.1.1 切片与MapTask并行度决定机制 1.问题引出 MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个J ...

  10. 设置Anaconda启动jupyter的默认目录

    要解决的问题:安装好Anaconda后打开jupyter总是会自动跳到c:下的用户目录,通过以下方法可以修改其默认打开的目录 吐槽:竟然没有设置默认打开目录的选项,只能通过修改配置文件完成,让人不爽. ...