BeanUtils

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()方法.

1// JavaBean 2public class Animal { 3 private String name; 4 private int age; 5 private String color; 6 private String sex; 7 8 public Animal() { 9 } 10 11 getXxx和setXxx省略…… 12} 13 14 15/** 16 * BeanUtils 17 */ 18@Test 19public void test1() throws Exception { 20 Map<String, Object> map = new HashMap<String, Object>(); 21 map.put("name", "tuantuan"); 22 map.put("age", 3); 23 map.put("color", "black"); 24 map.put("sex", "female"); 25 26 // 将map数据拷贝到javabean中 27 Animal a1 = new Animal(); 28 BeanUtils.populate(a1, map); 29 System.out.println(a1); // Animal [name=tuantuan, age=3, color=black, sex=female] 30 31 // 对象的拷贝 32 Animal a2 = new Animal(); 33 BeanUtils.copyProperties(a2, a1); 34 System.out.println(a2);// Animal [name=tuantuan, age=3, color=black, sex=female] 35 36 // 拷贝指定的属性 37 Animal a3 = new Animal(); 38 BeanUtils.copyProperty(a3, "name", "yuanyuan"); 39 System.out.println(a3); // Animal [name=yuanyuan, age=0, color=null, sex=null] 40 41 // 设置指定的属性 42 BeanUtils.setProperty(a3, "sex", "male"); 43 System.out.println(a3); // Animal [name=yuanyuan, age=0, color=null, sex=male] 44 45 // 克隆对象 46 Object object = BeanUtils.cloneBean(a3); 47 System.out.println(object); // Animal [name=yuanyuan, age=0, color=null, sex=male] 48}

ConvertUtils

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

主要方法

描述

convert(Object value, Class<?> targetType)

将给定的value转换成指定的Class类型

1// 将整型转换成字符串 2Object object = ConvertUtils.convert(123, String.class); 3String typeName = object.getClass().getTypeName(); 4System.out.println(typeName); 5 6// 将日期转换成字符串 7Object object2 = ConvertUtils.convert(new Date(), String.class); 8String typeName2 = object2.getClass().getTypeName(); 9System.out.println(typeName2); 10 11// 将字符串转换成Double 12Object object3 = ConvertUtils.convert("123", Double.class); 13String typeName3 = object3.getClass().getTypeName(); 14System.out.println(typeName3);

自定义类型转换:

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

1class MyConverter implements Converter { 2 private static SimpleDateFormat format; 3 4 public MyConverter(String pattern) { 5 format = new SimpleDateFormat(pattern); 6 } 7 8 @Override 9 public Object convert(Class type, Object value) { 10 if (value == null) { 11 return null; 12 } 13 14 if (value instanceof String) { 15 String tmp = (String) value; 16 if (tmp.trim().length() == 0) { 17 return null; 18 } else { 19 try { 20 return format.parse(tmp); 21 } catch (ParseException e) { 22 e.printStackTrace(); 23 } 24 } 25 } else { 26 throw new ConversionException("not String"); 27 } 28 return value; 29 } 30}

使用

1MyConverter converter = new MyConverter("yyyy-MM-dd HH:mm:ss"); 2// 注册该转换器 3ConvertUtils.register(converter, Date.class); 4Object object3 = ConvertUtils.convert("2019-03-13 14:04:00", Date.class); 5System.out.println(object3.getClass().getTypeName()); 6System.out.println(object3); 7 8 9// BeanUtils设置属性时,自动进行类型转换 10MyConverter converter = new MyConverter("yyyy-MM-dd HH:mm:ss"); 11// 注册该转换器 12ConvertUtils.register(converter, Date.class); 13Animal a5 = new Animal(); 14BeanUtils.copyProperty(a5, "birth", "2019-03-13 14:04:00"); 15System.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包

1String[] arrA = new String[]{"1", "2", "3"}; 2String[] arrB = new String[]{"1", "a", "b"}; 3List<String> listA = Arrays.asList(arrA); 4List<String> listB = Arrays.asList(arrB); 5 6// 判断集合是否为 空 7System.out.println(CollectionUtils.isEmpty(listA));// false 8System.out.println(CollectionUtils.isEmpty(listB));// false 9 10// 判断集合是否为 不为空 11System.out.println(CollectionUtils.isNotEmpty(listA));// true 12System.out.println(CollectionUtils.isNotEmpty(listB));// true 13 14// 两个集合的比较 15System.out.println(CollectionUtils.isEqualCollection(listA, listB));// false 16 17// 集合的操作 18// 取并集 19System.out.println(CollectionUtils.union(listA, listB));// [1, a, 2, b, 3] 20// 取交集 21System.out.println(CollectionUtils.intersection(listA, listB));// [1] 22// 取交集的补集 23System.out.println(CollectionUtils.disjunction(listA, listB));// [a, 2, b, 3] 24// 取集合相减 25System.out.println(CollectionUtils.subtract(listA, listB));// [2, 3] 26System.out.println(CollectionUtils.subtract(listB, listA));// [a, b] 27 28List<String> listC = new ArrayList<>(); 29listC.add("1"); 30listC.add("2"); 31listC.add("3"); 32String[] arrC = {"4", "5", "6"}; 33// 向集合中添加值 34CollectionUtils.addAll(listC, arrC); 35System.out.println(listC);// [1, 2, 3, 4, 5, 6]
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Android So动态加载 优雅实现与原理分析

背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我

BeanUtils - HelloWorld