概述
BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。
需要的jar包:
常用方法:
setProperty(Object obj,String name,Object value): 设置属性值,如果指定属性不存在,不抛异常
getProperty(Object obj,String name): 获得属性值,如果指定属性不存在,抛方法找不到异常
populate(Object bean, Map<String,String[]> properties):将Map数据封装到指定Javabean中,一般用于将表单的所有数据封装到javabean。
使用
import java.util.Arrays;
public class User {
private String uid;
private String userName;
private String password;
private String[] hobbies;
private int age;
public User() {
super();
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [uid=" + uid + ", userName=" + userName + ", password=" + password + ", hobbies="
+ Arrays.toString(hobbies) + ", age=" + age + "]";
}
}
public static void main(String[] args) throws Exception{
/* 实际开发中,需要封装到JavaBean中的数据存放在配置文件
* 内容:uid=u001 、userName=jack
* 注意:一般情况下,字段名称和属性名称一致的。
*/
//setProperty给指定属性设置内容
User user = new User();
//封装数据来自配置文件 , 底层其实user.setUid("u002")
BeanUtils.setProperty(user, "uid", "u002");
BeanUtils.setProperty(user, "userName", "rose");
System.out.println("封装后:" + user);
//getProperty获得指定属性的值
String userName = BeanUtils.getProperty(user, "userName");
System.out.println(userName);
//populate填充
//1.模拟数据,创建一个Map,填充需要的数据
Map<String,String[]> map = new HashMap<String,String[]>();
map.put("uid", new String[]{"u001"});
map.put("userName", new String[]{"jack","rose"});
map.put("password", new String[]{"1234"});
map.put("hobbies", new String[]{"打篮球","跑步","打网球"});
map.put("age", new String[]{"23"});
//2.将使用populate进行填充
// 可以向指定的属性,填充一组数据。需要类型必须是[]
// 如果属性不是数组,将使用map.value表示数组中的第一个。
// BeanUtils支持类型:基本类型和基本类型对应的包装类,自动将字符串转换基本类型。
User user = new User();
BeanUtils.populate(user, map);
System.out.println(user);
}
自定义工具类
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
/**
* @ClassName: MyBeanUtils
* @Description: 自定义的JavaBean工具类
*/
public class MyBeanUtils {
/**
* @Title: populate
* @Description: 自动填充
* @param bean
* @param properties
*/
public static void populate(Object bean, Map<String,String[]> properties){
try {
BeanUtils.populate(bean, properties);
} catch (Exception e) {
//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)
throw new RuntimeException(e);
}
}
/**
* @Title: populate
* @Description: 自动填充,并返回bean对象
* @param beanClass
* @param properties
* @return
*/
public static Object populate(Class beanClass, Map<String,String[]> properties){
try {
//1 使用反射进行实例化
Object bean = beanClass.newInstance();
//2 填充数据
BeanUtils.populate(bean, properties);
//3 将填充好JavaBean实例返回
return bean;
} catch (Exception e) {
//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)
throw new RuntimeException(e);
}
}
/**
* @Title: populate
* @Description: 自动填充
* @param bean
* @param properties
*
* Class<T>此处的T就是一个变量,在运行时,接收具体类型。例如:User
* 变量必须先定义在使用
* 泛型变量的定义方式:修饰符 <变量名> 返回值
*/
public static <T> T populate(Class<T> beanClass, Map<String,String[]> properties){
try {
//1 使用反射进行实例化
T bean = beanClass.newInstance();
//2 填充数据
BeanUtils.populate(bean, properties);
//3 将填充好JavaBean实例返回
return bean;
} catch (Exception e) {
//将编译时异常,转换成运行时,方便调用者(使用者不需要再次处理异常)
throw new RuntimeException(e);
}
}
}