感谢原文作者:小老弟

原文链接:https://www.cnblogs.com/syncmr/p/10523576.html

简介

BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作。

BeanUtils一共分4个包:

org.apache.commons.beanutils

org.apache.commons.beanutils.converters

org.apache.commons.beanutils.locale

org.apache.commons.beanutils.locale.converters

其中需要我们特别关注的是这个org.apache.commons.beanutils包,其他包都是起辅助作用的。其中上面两个没有针对本地化的任何处理,执行效率高。下面两个对本地化有要求。

BeanUtils类

主要提供了对于JavaBean进行各种操作,比如对象,属性复制等等。

BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且BeanUtils设置属性的时候也是依赖于底层的getter和setter方法。如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换(参考下面的ConvertUtils)

主要方法 描述
cloneBean(Object bean) 对象的克隆
copyProperties(Object dest, Object orig) 对象的拷贝
copyProperty(Object bean, String name, Object value) 拷贝指定的属性值到指定的bean
setProperty(Object bean, String name, Object value) 设置指定属性的值
populate(Object bean, Map<String,? extends Object> properties) 将map数据拷贝到javabean中(map的key要与javabean的属性名称一致)

注:copyProperty与setProperty,日常使用时推荐copyProperty。如果我们需要自定义实现>populate()方法,那么我们可以override setProperty()方法.

使用示例

// JavaBean
public class Animal {
private String name;
private int age;
private String color;
private String sex; public Animal() {
} getXxx和setXxx省略……
}
/**
* BeanUtils
*/
@Test
public void test1() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "tuantuan");
map.put("age", 3);
map.put("color", "black");
map.put("sex", "female"); // 将map数据拷贝到javabean中
Animal a1 = new Animal();
BeanUtils.populate(a1, map);
System.out.println(a1); // Animal [name=tuantuan, age=3, color=black, sex=female] // 对象的拷贝
Animal a2 = new Animal();
BeanUtils.copyProperties(a2, a1);
System.out.println(a2);// Animal [name=tuantuan, age=3, color=black, sex=female] // 拷贝指定的属性
Animal a3 = new Animal();
BeanUtils.copyProperty(a3, "name", "yuanyuan");
System.out.println(a3); // Animal [name=yuanyuan, age=0, color=null, sex=null] // 设置指定的属性
BeanUtils.setProperty(a3, "sex", "male");
System.out.println(a3); // Animal [name=yuanyuan, age=0, color=null, sex=male] // 克隆对象
Object object = BeanUtils.cloneBean(a3);
System.out.println(object); // Animal [name=yuanyuan, age=0, color=null, sex=male]
}

ConvertUtils

这个工具类的职能是在字符串和指定类型的实例之间进行转换。 实际上,BeanUtils是依赖ConvertUtils来完成类型转换,但是有时候我们可能需要自定义转换器来完成特殊需求的类型转换;

主要方法 描述
convert(Object value, Class<?> targetType) 将给定的value转换成指定的Class类型

功能演示

// 将整型转换成字符串
Object object = ConvertUtils.convert(123, String.class);
String typeName = object.getClass().getTypeName();
System.out.println(typeName); // 将日期转换成字符串
Object object2 = ConvertUtils.convert(new Date(), String.class);
String typeName2 = object2.getClass().getTypeName();
System.out.println(typeName2); // 将字符串转换成Double
Object object3 = ConvertUtils.convert("123", Double.class);
String typeName3 = object3.getClass().getTypeName();
System.out.println(typeName3);

自定义转换使用示例

自定义类型转换:

自定义转换器,实现Converter接口,重写convert方法

class MyConverter implements Converter {
private static SimpleDateFormat format; public MyConverter(String pattern) {
format = new SimpleDateFormat(pattern);
} @Override
public Object convert(Class type, Object value) {
if (value == null) {
return null;
} if (value instanceof String) {
String tmp = (String) value;
if (tmp.trim().length() == 0) {
return null;
} else {
try {
return format.parse(tmp);
} catch (ParseException e) {
e.printStackTrace();
}
}
} else {
throw new ConversionException("not String");
}
return value;
}
}

使用

MyConverter converter = new MyConverter("yyyy-MM-dd HH:mm:ss");
// 注册该转换器
ConvertUtils.register(converter, Date.class);
Object object3 = ConvertUtils.convert("2019-03-13 14:04:00", Date.class);
System.out.println(object3.getClass().getTypeName());
System.out.println(object3);
// BeanUtils设置属性时,自动进行类型转换
MyConverter converter = new MyConverter("yyyy-MM-dd HH:mm:ss");
// 注册该转换器
ConvertUtils.register(converter, Date.class);
Animal a5 = new Animal();
BeanUtils.copyProperty(a5, "birth", "2019-03-13 14:04:00");
System.out.println(a5);// Animal [name=null, age=0, color=null, sex=null, birth=Wed March 13 14:04:00 CST 2019]

PropertyUtils

BeanUtils与PropertyUtils这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。

举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!当然2个Bean之间的同名属性的类型必须是可以转化的,否则用BeanUtils一样会报错。若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。由于不做类型转化,用PropertyUtils在速度上会有很大提高!

CollectionUtils

利用这个工具类,我们对集合进行修改、查询、过滤等操作

CollectionUtils属于commons-collections包

String[] arrA = new String[]{"1", "2", "3"};
String[] arrB = new String[]{"1", "a", "b"};
List<String> listA = Arrays.asList(arrA);
List<String> listB = Arrays.asList(arrB); // 判断集合是否为 空
System.out.println(CollectionUtils.isEmpty(listA));// false
System.out.println(CollectionUtils.isEmpty(listB));// false // 判断集合是否为 不为空
System.out.println(CollectionUtils.isNotEmpty(listA));// true
System.out.println(CollectionUtils.isNotEmpty(listB));// true // 两个集合的比较
System.out.println(CollectionUtils.isEqualCollection(listA, listB));// false // 集合的操作
// 取并集
System.out.println(CollectionUtils.union(listA, listB));// [1, a, 2, b, 3]
// 取交集
System.out.println(CollectionUtils.intersection(listA, listB));// [1]
// 取交集的补集
System.out.println(CollectionUtils.disjunction(listA, listB));// [a, 2, b, 3]
// 取集合相减
System.out.println(CollectionUtils.subtract(listA, listB));// [2, 3]
System.out.println(CollectionUtils.subtract(listB, listA));// [a, b] List<String> listC = new ArrayList<>();
listC.add("1");
listC.add("2");
listC.add("3");
String[] arrC = {"4", "5", "6"};
// 向集合中添加值
CollectionUtils.addAll(listC, arrC);
System.out.println(listC);// [1, 2, 3, 4, 5, 6]

Maven导入

	    <!--BeanUtils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

常用代码示例

 Enumeration<String> parameterNames = request.getParameterNames();
//封装 Page Bean --Start
Page page = new Page();
try {
while(parameterNames.hasMoreElements()){
String name=parameterNames.nextElement();
String value=request.getParameter(name);
BeanUtils.setProperty(page,name,value);
}
//封装 Page Bean --End
//服务层提取数据
Map<String, Object> articles = service.getPaginationData(page);
JSONObject jsonObject = new JSONObject(articles);
response.getWriter().write(jsonObject.toString());
}catch (Exception e){
e.printStackTrace();
response.getWriter().write(R.JSON.JSON_GLOBAL_FAIL_RESULT);
}

BeanUtils JavaBean 工具包使用的更多相关文章

  1. BeanUtils——JavaBean相互转换及字典翻译

    JavaBean相互转换 在升级公司架构过程中,发现有大量Entity与DTO相互转换的问题,并且其中还伴随DTO中的数据字典翻译,所以特意写个工具类,主要利用spring提供的BeanUtils工具 ...

  2. 黑马程序员:Java基础总结----JavaBean 内省

    黑马程序员:Java基础总结 JavaBean 内省   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! JavaBean  内省 软件包 java.beans 包含与开 ...

  3. JAVABeanUtils

    在写如何使用java BeanUlits 之前需要清楚几件事情 1. 我们每次所定义的类,其实是实体,同时也被称作为JavaBean; 2.  为什么我们要使用BeanUlits这个框架     &g ...

  4. 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性

      本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...

  5. 32_使用BeanUtils工具包操作JavaBean

      由于对属性设置值和得到值的需求很多,使用频率很高,所以有一些开源勇士 不满足于JavaBean API 中IntroSpector来操作bean, 写出来了通用的BeanUtils工具,来进一步简 ...

  6. 使用beanUtils操纵javabean

    Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单.易用的API操作Bean的属性——BeanUtils,在Beanutil中可以直接进行类型的自动转换. ...

  7. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

  8. JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  9. javabean的内省技术和BeanUtils的使用

    一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...

随机推荐

  1. 你真的会用react hooks?看看eslint警告吧!(如何发请求、提升代码性能等问题)

    前言 看过几个react hooks 的项目,控制台上几百条警告,大多是语法不规范,react hooks 使用有风险,也有项目直接没开eslint.当然,这些项目肯定跑起来了,因为react自身或者 ...

  2. uniapp蓝牙传输中文乱码问题

    问题描述:app接收到蓝牙传出过来的二进制数据,1.app进行arrbuff转成16进制字符串 // ArrayBuffer转16进度字符串示例 function ab2hex(buffer) { c ...

  3. MySQL高级查询与编程笔记 • 【第5章 常见数据库对象】

    全部章节   >>>> 本章目录 5.1 视图 5.1.1 视图的定义 5.1.2 视图的优点 5.1.3 视图的创建和使用 5.1.4 利用视图解决数据库的复杂应用 5.1. ...

  4. Eclipse中英文对照表(整理笔记)

    Eclipse百度界面中英文对照 目录 Eclipse百度界面中英文对照 0.菜单栏 1.File 文件菜单 2.Edit 编辑菜单 3.Source 源代码 4.Refactor 重构 5.Navi ...

  5. 编写Java程序,使用面向接口编程模拟不同动物的吼叫声

    返回本章节 返回作业目录 需求说明: 使用面向接口编程模拟不同动物的吼叫声 实现思路: 使用面向接口编程模拟不同动物吼叫声的实现思路: 定义发声接口Voice,在其中定义抽象吼叫方法sing(). 分 ...

  6. Java中的对象、类、抽象类、接口的理解

    1.对象 对象是个具体的东西,有着明确的属性特征和行为特征. 例如:你手上牵着的女朋友或男朋友就是个具体的对象. 如图中的苏格兰折耳猫,特征是耳朵向下呈折叠状,有着具体的颜色(你看到的颜色),并且和其 ...

  7. centos6.5-rsync+inotify

    一.目的 通过监控192.168.3.10的目录,实现实时同步. 实验环境 centos1       192.168.3.10 centos2       192.168.3.11 二.配置 cen ...

  8. Git 的基本命令的使用

    1.获得Git仓库(克隆一份代码到本地仓库) git clone url 2.更新本地的代码 git pull 3.查看本地修改的文件 git status 4.将本地的修改加到stage中 git ...

  9. CTF-sql-group by报错注入

    本文章主要涉及group by报错注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.下图为本次文章所使用到 user表,该表所在的数据库为 test 二.首先介绍一下本文章所使用 ...

  10. win+ r 命令

    Win 键+R calc:计算器 notepad:记事本 mspaint:画图 cmd:控制台 control:控制面板 desk.cpl:打开控制面板中的桌面设置 main.cpl:鼠标设置 ine ...