文章目录
BeanUtils简介
BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。
JavaBean
满足以下三个条件,就可以说是一个JavaBean。JavaBean其实也就是一个类。
- 类必须使用public修饰。
- 提供无参数的构造器。
- 提供getter和setter方法访问属性。
了解:我们创建了JavaBean并实例化,一般情况是通过使用与属性相对应的getXxx,setXxx方法去访问这个对象的属性。但是在某些情况下,需要动态的访问这个Java对象的属性,我们可以使用反射来实现,但是使用反射操作较为复杂,而使用BeanUtils可以简化这一过程。
BeanUtils的基本使用
常用的操作及方法:
- 对JavaBean的属性进行赋值和取值。
//给指定对象bean的指定name属性赋值为指定值value。 如果指定的属性不存在,则什么也不发生。
public static void setProperty(Object bean, String name, Object value)
//获取指定对象bean指定name属性的值。如果指定的属性不存在,则会抛出异常。 注意;当属性的类型是数组类型时,获取到的值数组中的第一个值。
public static String getProperty(Object bean, String name)
- 将一个JavaBean所有属性赋值给另一个JavaBean对象中。
// 将对象orig的属性值赋值给对象dest对象对应的属性 注意:只有属性名名相同且类型一致的才会赋值成功。
public static void copyProperties(Object dest, Object orig)
- 将一个Map集合的数据封装到一个JavaBean对象中。
//将一个Map集合中的数据封装到指定对象bean中 注意:对象bean的属性名和Map集合中键要相同。
public static void populate(Object bean, Map<String, ? extends Object> properties)
BeanUtils常用操作代码示例
1.导入相关Jar包
下载地址:http://commons.apache.org/
相关的jar包说明:
commons‐beanutils‐1.9.3.jar 工具核心包
commons‐logging‐1.1.1.jar 日志记录包
commons‐collections‐3.2.2.jar 增强的集合包
2.创建一个JavaBean类:Student
public class Student {
private String name;
private int age;
private String sex;
//默认有一个空参构造器
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
3.测试
对JavaBean的属性进行赋值和取值
/*对JavaBean的属性进行赋值和取值。 方法: public static void setProperty(Object bean, String name, Object value) 给指定对象bean的指定name属性赋值为指定值value。 如果指定的属性不存在,则什么也不发生。 public static String getProperty(Object bean, String name) 获取指定对象bean指定name属性的值。如果指定的属性不存在,则会抛出异常。 注意;当属性的类型是数组类型时,获取到的值数组中的第一个值。 */
@Test
public void BeanUtilsTest1() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
//创建JavaBean对象(Student对象)
Student student = new Student();
//调用BeanUtils工具类的方法给对象属性赋值
BeanUtils.setProperty(student,"name","张三");
BeanUtils.setProperty(student,"age",18);
BeanUtils.setProperty(student,"sex","男");
System.out.println(student);
//调用BeanUtils工具类的方法获取对象属性值
String name = BeanUtils.getProperty(student, "name");
String age = BeanUtils.getProperty(student, "age");
String sex = BeanUtils.getProperty(student, "sex");
System.out.println("姓名:"+ name);
System.out.println("年龄:"+age);
System.out.println("性别:"+ sex);
}
测试运行:
将一个JavaBean所有属性赋值给另一个JavaBean对象中
分两种情况:
- 相同类型的对象(这里指属性名相同)之间属性赋值
/* 将一个JavaBean对象的属性赋值给另一个JavaBean对象 方法: public static void copyProperties(Object dest, Object orig) 将对象orig的属性值赋值给对象dest对象对应的属性 注意:只有属性名名相同且类型一致的才会赋值成功。 */
@Test//相同类型的对象之间属性赋值
public void BeanUtilsTest2() throws InvocationTargetException, IllegalAccessException {
//创建一个学生对象
Student student1 = new Student();
//调用BeanUtils工具类的方法给student1对象属性赋值
BeanUtils.setProperty(student1,"name","张三");
BeanUtils.setProperty(student1,"age",18);
BeanUtils.setProperty(student1,"sex","男");
System.out.println("student1="+student1);
//再创建一个学生对象
Student student2 = new Student();
//调用BeanUtils工具类的方法将student1对象的属性值赋值给student2对象
BeanUtils.copyProperties(student2,student1);
System.out.println("student2="+student2);
}
测试运行:
- 不同类型的对象(这里指属性名有差异)之间属性赋值:只有属性名相同的才会被赋值
再创建一个JavaBean类用于测试:User
public class User {
private String name;
private int age;
private String gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", address='" + address + '\'' +
'}';
}
}
@Test//不同类型的对象之间属性赋值:只有属性名相同的才会被赋值
public void BeanUtilsTest3() throws InvocationTargetException, IllegalAccessException {
//创建一个Student对象
Student student = new Student();
//调用BeanUtils工具类的方法给student1对象属性赋值
BeanUtils.setProperty(student,"name","张三");
BeanUtils.setProperty(student,"age",18);
BeanUtils.setProperty(student,"sex","男");
System.out.println(student);
//创建一个User对象
User user = new User();
//调用BeanUtils工具类的方法将student对象的属性值赋值给user对象
BeanUtils.copyProperties(user,student);
System.out.println(user);
}
测试运行:
将一个Map集合的数据封装到一个JavaBean对象中
/*将一个Map集合的数据封装到一个JavaBean对象中。 方法: public static void populate(Object bean, Map<String, ? extends Object> properties) 将一个Map集合中的数据封装到指定对象bean中 注意:对象bean的属性名和Map集合中键要相同。 */
@Test
public void BeanUtilsTest4() throws InvocationTargetException, IllegalAccessException {
//创建一个Student对象
Student student = new Student();
System.out.println("封装前:"+student);
HashMap<String, Object> map = new HashMap<>();
map.put("name","王五");
map.put("age",20);
map.put("sex","男");
//调用BeanUtils工具类的方法将map数据封装到student中
BeanUtils.populate(student,map);
System.out.println("封装后:"+student);
}
测试运行: