BeanUtils JavaBean 工具包使用
感谢原文作者:小老弟
原文链接: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 工具包使用的更多相关文章
- BeanUtils——JavaBean相互转换及字典翻译
JavaBean相互转换 在升级公司架构过程中,发现有大量Entity与DTO相互转换的问题,并且其中还伴随DTO中的数据字典翻译,所以特意写个工具类,主要利用spring提供的BeanUtils工具 ...
- 黑马程序员:Java基础总结----JavaBean 内省
黑马程序员:Java基础总结 JavaBean 内省 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! JavaBean 内省 软件包 java.beans 包含与开 ...
- JAVABeanUtils
在写如何使用java BeanUlits 之前需要清楚几件事情 1. 我们每次所定义的类,其实是实体,同时也被称作为JavaBean; 2. 为什么我们要使用BeanUlits这个框架 &g ...
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...
- 32_使用BeanUtils工具包操作JavaBean
由于对属性设置值和得到值的需求很多,使用频率很高,所以有一些开源勇士 不满足于JavaBean API 中IntroSpector来操作bean, 写出来了通用的BeanUtils工具,来进一步简 ...
- 使用beanUtils操纵javabean
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单.易用的API操作Bean的属性——BeanUtils,在Beanutil中可以直接进行类型的自动转换. ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
- JAVA中反射机制五(JavaBean的内省与BeanUtils库)
内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...
- javabean的内省技术和BeanUtils的使用
一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...
随机推荐
- 从JVM设计角度解读Java内存模型
第十六章:Java内存模型 本文我们将重点放在Java内存模型(JMM)的一些高层设计问题,以及JMM的底层需求和所提供的保证,还有一些高层设计原则背后的原理. 例如安全发布,同步策略的规范以及一致性 ...
- HTML网页设计基础笔记 • 【第4章 CSS3基础】
全部章节 >>>> 本章目录 4.1 CSS 概述 4.1.1 CSS 简介 4.1.2 CSS3 基本语法 4.1.3 样式表的分类 4.2 CSS 基本选择器 4.2. ...
- Log4j2进阶使用(按大小时间备份日志)
1.进阶说明 本文介绍Log4j2进阶使用, 基本使用请参考Log4j2基本使用入门. 本文基于上面的基本使用入门, 主要介绍按照日志大小和时间备份日志, 并且限制备份日志的个数, 以及删除过期的备份 ...
- .net core中的Options重新加载机制
Options是.net core提出的一种辅助配置机制,即选项. 目前,我们可以使用的Options有五种(源码): IOptionsFactory<>:Options的创建工厂(Sin ...
- Oracle 查询NULL字段/空字符串
简单记录一下: 工作中需要查询某个字段值为空的数据, 最开始查询的时候按照以前的思路 : 1.where 字段名=NULL,点击F8,未查到结果: 2.where 字段名='',点击F8,未查到结果: ...
- 初识python: 字符串常用操作
直接上代码示例: #!/user/bin env python # author:Simple-Sir # time:20180914 # 字符串常用操作 name = 'lzh lyh' print ...
- 初识python: while循环 猜年龄小游戏
知识点: 1.python注释方法: 单行注释: # 多行注释: '''注释内容 ''' (单引号或双引号都可以),亦可打印多行 例: #此处是单行注释信息 print('这里是打印内容') #这里 ...
- Flask_上下文(六)
Flask中有两种上下文,应用上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含了请求的各种信息, ...
- 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】
1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...
- HDURomantic
Problem - 1004 (hdu.edu.cn) 扩展欧几里得解决线性同余方程.先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解.另一个可以通过相减,或者一样的 ...