Skip to main content
 首页 » 编程设计

Apache Commons BeanUtils 示例教程

2022年07月19日166leader

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