Apache Commons BeanUtils 示例教程
Apache Commons BeanUtils 包括所有必要的java bean工具类。java bean简单定义为普通java类包括字段、set/get方法以及默认无参构造函数。java提供自身和反射能力,用于标识get/set方法并动态调用。但这个API比较难学,即使实现简单功能也需要写一些模板代码。本文介绍Apache Commons BeanUtils 的基本用法,简化应用反射功能。
1.maven 依赖
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
读者可以获得最新版本。
2. 示例java Bean
首先我们创建两个示例bean,Course 和 Student ,包括基本set、get方法。
public class Course {
private String name;
private List<String> codes;
private Map<String, Student> enrolledStudent = new HashMap<>();
// standard getters/setters
}
public class Student {
private String name;
// standard getters/setters
}
Course类包括课程名称和课程代码,以及多个选修学生。选修学生由唯一的注册Id标识。课程类将已注册的学生保存在一个Map对象中,其中注册Id是键,学生对象将是值。
3.访问属性
bean属性可以分为三类。
3.1 简单属性
单值属性也称为简单属性或标量属性。他们的值可能是基本类型(int,float)或复杂类型对象。BeanUtils 中的 PropertyUtils类容许我们修改Bean的简单属性。请看示例:
Course course = new Course();
String name = "Computer Science";
List<String> codes = Arrays.asList("CS", "CS01");
PropertyUtils.setSimpleProperty(course, "name", name);
PropertyUtils.setSimpleProperty(course, "codes", codes);
3.2 索引属性
索引属性,即可以通过索引访问集合属性的单个值。作为java bean的扩展,BeanUtils 考虑了java.util.List类型值以及索引。PropertyUtils的setIndexedProperty方法可以修改索引属性的单个值。示例代码如下:
PropertyUtils.setIndexedProperty(course, "codes[1]", "CS02");
3.3 映射属性
任何以java.util.Map作为底层类型的属性称为映射属性。BeanUtils 允许我们通过使用String值key更新映射属性中的单个值。
Student student = new Student();
String studentName = "Joe";
student.setName(studentName);
PropertyUtils.setMappedProperty(course, "enrolledStudent(ST-1)", student);
4. 嵌套属性访问
如何属性值是对象,我们需要值里面对象——即访问嵌套属性。PropertyUtils允许我们访问和修改嵌套属性。假设我们想通过Course对象访问Student的name属性,示例代码:
String name = course.getEnrolledStudent("ST-1").getName();
使用PropertyUtils中的 getNestedProperty 方法可以访问嵌套属性,setNestedProperty方法可以修改嵌套属性:
Student student = new Student();
String studentName = "Joe";
student.setName(studentName);
String nameValue
= (String) PropertyUtils.getNestedProperty(
course, "enrolledStudent(ST-1).name");
拷贝Bean属性
从一个对象拷贝属性到另一个对象,通常代码冗长且易错。BeanUtils类提供了copyProperties方法可以从源对象拷贝属性至目标对象,需要两者属性名称相同。
下面定义另一个Bean为CourseEntity,和前面的Course一样,除了enrolledStudent属性改名为students,代码如下:
public class CourseEntity {
private String name;
private List<String> codes;
private Map<String, Student> students = new HashMap<>();
// standard getters/setters
}
现在拷贝两者属性:
Course course = new Course();
course.setName("Computer Science");
course.setCodes(Arrays.asList("CS"));
course.setEnrolledStudent("ST-1", new Student());
CourseEntity courseEntity = new CourseEntity();
BeanUtils.copyProperties(course, courseEntity);
因为仅仅名称相同会拷贝,所以,不能拷贝Course类中的enrolledStudent 值。
总结
本文我们通过实例介绍了BeanUtils提供的工具类。探讨了不能类型的属性以及如何访问修改他们的值,接着介绍如何访问嵌套属性和对象之间如何拷贝属性。JAVA 的自省和反射功能也可以实现同样功能,但BeanUtils通过单个简单方法调用就能实现,很大程度地简化代码,降低学习门槛。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/84800272