BeanUtils使用
一、BeanUtils概要
BeanUtils是由Apache公司所开发的工具包,目的是为了简化数据封装,方便Java程序员对JavaBean类进行简便的操作。
注意事项:
- 被封装的JavaBean必须是标准的Java类
- 该JavaBean必须被public所修饰
- 必须提供空构造器
- 成员变量必须私有化,被private所修饰
- 提供公共的setter和getter方法
1.1BeanUtils工具JAR包
- commons-beanutils-*.jar
- commons-logging-*.jar
1.1.1下载beanutils
选择其中一个下载
得到一个.gz的压缩包:
解压.gz的压缩包:
将commons-beanutils-1.9.4.jar引入(复制)到项目lib目录下,右键jar包选择Add as library
1.1.2下载logging
commons-logging的下载和导入同理
进其导入lib目录下:
1.2关于属性和成员变量
不少人将属性和成员变量混为一谈。在这里简单说明一下两者的异同和联系。
- 差异:
-
成员变量
简单来说就是定义在类和方法之间的变量 -
属性
在JavaBean中,去掉get或set后得到的字符串,将其首字母小写后即为属性。如:getUsername() --> Username --> username, username即为该JavaBean的一个属性。
- 联系:
可能你已经注意到,这个username属性和username成员变量是一样的。这是一般情况(标准)下,实际上,两者的联系是:属性的存在是用于操纵或者获取成员变量的,所以说,相应的setter或getter方法可能会不同,即可以使用setAbc(String username)来设置username成员变量,而这里的abc就是属性。
通常情况下,我们的属性和成员变量的名称是相同的,在没有特殊的要求下,推荐这样的编写方式。
二、BeanUtils简单使用
BeanUtils提供了对于JavaBean进行各种操作,比如对象、属性复制等。
BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型转换,并且BeanUtils设置属性的时候也是依赖于底层的getter和setter方法。如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换(参考下面的ConvertUtils)
2.1常用方法
参考文档(英文):解压commons-beanutils-1.9.4.jar后即可得到。
方法名称 | 描述信息 |
---|---|
populate(Object bean, Map<String,? extends Object> properties) | 根据指定的名称/值对填充指定Bean的JavaBeans属性。 |
setProperty(Object bean, String name, Object value) | 设置指定属性的值 |
copyProperty(Object bean, String name, Object value) | 拷贝指定的属性值到指定的bean |
copyProperties(Object dest, Object orig) | 对象的拷贝 |
cloneBean(Object bean) | 对象的克隆 |
2.2实例
创建一个JavaBean类
pulic class User{
private String username;
private String password;
private Date birthday;
public User(){}
pulic void setUsername(String username){
this.username = username;
}
pulic String getUsername(){
retrun this.username;
}
pulic void setPassword(String password){
this.password= password;
}
pulic String getPassword(){
retrun this.password;
}
pulic void setPassword(Date birthday){
this.birthday= birthday;
}
pulic Date getPassword(){
retrun this.birthday;
}
}
- BeanUtils.populate(Object bean, Map<String,? extends Object> properties)
根据指定的名称/值对填充指定Bean的JavaBeans属性。
User user = new User(); // 被封装的JavaBean
Map<String, String[]> loginUser = request.getParameterMap(); // 封装的数据Map集合
/* 等价:
* Map<String, String> loginUser = new HasheMap<>();
* loginUser.put("username","langkye");
* loginUser.put("password","admin");
*/
BeanUtils.populate(user,loginUser);
System.out.println(user); // 输出:User{username='langkye', password='admin', birthday=null}
- BeanUtils.setProperty(Object bean, String name, Object value)
设置指定属性的值
User user = new User(); // 被封装的JavaBean
BeanUtils.setProperty(user,"username","langkye"); // 设置username属性
BeanUtils.setProperty(user,"password","admin"); // 设置password属性
System.out.println(user); // 输出:User{username='langkye', password='admin', birthday=null}
- BeanUtils.copyProperty(Object bean, String name, Object value)
拷贝指定的属性值到指定的bean
User user1 = new User();
BeanUtils.copProperties(user1, "username","langkye");
System.out.println(user1); // 输出:User{username='langkye', password=null, birthday=null}
- BeanUtils.copyProperties(Object dest, Object orig)
对象的拷贝
// 对象的拷贝
User user2 = new User();
BeanUtils.copyProperties(user, user2);
System.out.println(user1); // 输出:User{username='langkye', password='admin', birthday=null}
- BeanUtils.cloneBean(Object bean)
对象的克隆
// 克隆对象
User user3 = (User)BeanUtils.cloneBean(user);
System.out.println(user3); // 输出:User{username='langkye', password='admin', birthday=null}
三、ConvertUtils简单使用
ConvertUtils为类型转换工具类
ConvertUtils可以使字符串和指定类型的实例之间进行转换。 实际上,BeanUtils是依赖ConvertUtils来完成类型转换,但是有时候我们可能需要自定义转换器来完成特殊需求的类型转换;
3.1 常用方法
方法 | 描述 |
---|---|
convert(Object value, Class<?> targetType) | 将给定的value转换成指定的Class类型 |
register(Converter converter, Class clazz) | 给BeanUtils注册指定类型的转换器 |
3.2字符串和Date类型转换
- convert(Object value, Class<?> targetType)
// 将日期转换成字符串
String DateStr = (String)ConvertUtils.convert(new Date(), String.class);
System.out.println(DateStr); // Fri May 20 00:00:00 CST 2050
System.out.println((ConvertUtils.convert(new Date(), String.class)).getClass().getTypeName()); // java.lang.String
- register(Converter converter, Class clazz)
Map<String,String> paraMap = new HashMap<>().put("birthday","2050-05-20");
// 将字符串转换为日期类型
DateConverter dc = new DateConverter();
dc.setPattern("yyyy-MM-dd");
ConvertUtils.register(dc,Date.class);
BeanUtils.populate(user4,paraMap);
System.out.println(user4); // User {username=null,password=null,birthday='Fri May 20 00:00:00 CST 2050'}
3.3 字符串和Double
// 将字符串转换成Double
Double doubleNumber = (Double)ConvertUtils.convert("2050", Double.class);
System.out.println(doubleNumber); // 2050.0
String dn_typeName = doubleNumber.getClass().getTypeName();
System.out.println(dn_typeName); // java.lang.Double