一、关于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. Educational Codeforces Round 93 (Rated for Div. 2)题解

    A. Bad Triangle 题目:https://codeforces.com/contest/1398/problem/A 题解:一道计算几何题,只要观察数组的第1,2,n个,判断他们能否构成三 ...

  2. importTSV工具导入数据到hbase

    1.建立目标表test,确定好列族信息. create'test','info','address' 2.建立文件编写要导入的数据并上传到hdfs上 touch a.csv vi a.csv 数据内容 ...

  3. Robotium和Espresso大PK——速度篇

    引言 Espresso和Robotium都是android UI自动化测试框架,且都是建立在Android Instrument的基础之上.对于测试人员来说,UI测试应该具备如下三个特点:1. 容易编 ...

  4. 贫血模型和DDD模型

    贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...

  5. 更改默认Xcode

    更改默认 Xcode 的指令: sudo xcode-select -switch /Applications/Xcode.app  如果系统里面有好几个版本的 Xcode,可以用这个命令指定默认的 ...

  6. 解决SpringBoot jar包中的文件读取问题

    前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们 ...

  7. 初识ABP vNext(7):vue身份认证管理&租户管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ...

  8. 一篇文章高效定位iframe

    今天跟大家分享的是如何高效的定位iframe.我们来看一段最早的代码: # coding: utf-8from selenium import webdriverfrom time import sl ...

  9. [ASP.NET Core开发实战]基础篇05 服务器

    什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器. Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用. ...

  10. 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。

    这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...