Apache Commons BeanUtils 示例教程

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通过单个简单方法调用就能实现,很大程度地简化代码,降低学习门槛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值