Apache Commons BeanUtils

Apache Commons BeanUtils

1. обзор

Apache Commons BeansUtils содержит все инструменты, необходимые для работы с компонентами Java.

Проще говоря, бин - это простые Java-классы, содержащие поля, методы получения / установки и конструктор без аргументов.

Java предоставляет возможности рефлексии и самоанализа для идентификации методов получения и установки и их динамического вызова. Однако эти API могут быть сложными для изучения и могут потребовать от разработчиков написания стандартного кода для выполнения простейших операций.

2. Maven Зависимости

Вот зависимость Maven, которую необходимо включить в файл POM перед его использованием:


    commons-beanutils
    commons-beanutils
    1.9.3

Последнюю версию можно найтиhere.

3. Создание Java Bean

Давайте создадим два класса bean-компонентовCourse иStudent с типичными методами получения и установки.

public class Course {
    private String name;
    private List codes;
    private Map enrolledStudent = new HashMap<>();

    //  standard getters/setters
}
public class Student {
    private String name;

    //  standard getters/setters
}

У нас есть классCourse с названием курса, кодами курса и несколькими зачисленными студентами. Зачисленные студенты идентифицируются по уникальному идентификатору зачисления. КлассCourse поддерживает зачисленных студентов в объектMap, где идентификатор регистрации является ключом, а объект student будет значением.

4. Доступ к собственности

Свойства бина можно разделить на три категории.

4.1. Простое свойство

Свойства с одним значением также называются простыми или скалярными.

Их значение может быть примитивным (например, int, float) или объектами сложного типа. BeanUtils имеет классPropertyUtils, который позволяет нам изменять простые свойства в Java Bean.

Вот пример кода для установки свойств:

Course course = new Course();
String name = "Computer Science";
List codes = Arrays.asList("CS", "CS01");

PropertyUtils.setSimpleProperty(course, "name", name);
PropertyUtils.setSimpleProperty(course, "codes", codes);

4.2. Индексированное свойство

Индексированные свойства имеют коллекцию в качестве значения, к которому можно получить индивидуальный доступ с помощью номера индекса. Как расширение JavaBean, BeanUtils также считает значения типаjava.util.List индексированными.

Мы можем изменить индивидуальное значение индексированного свойства, используя методPropertyUtils’ssetIndexedProperty.

Вот пример кода, модифицирующего индексированное свойство:

PropertyUtils.setIndexedProperty(course, "codes[1]", "CS02");

4.3. Сопоставленное свойство

Любое свойство, в основе которого лежитjava.util.Map, называется отображаемым свойством. BeanUtils позволяет нам обновлять отдельное значение на карте с помощью ключаString-valued.

Вот пример кода для изменения значения в сопоставленном свойстве:

Student student = new Student();
String studentName = "Joe";
student.setName(studentName);

PropertyUtils.setMappedProperty(course, "enrolledStudent(ST-1)", student);

5. Доступ к вложенному свойству

Если значение свойства является объектом, и нам нужно получить доступ к значению свойства внутри этого объекта - это будет доступ к вложенному свойству. PropertyUtils позволяет нам получить доступ, а такжеmodify nested properties.

Предположим, мы хотим получить доступ к свойству name классаStudent через объектCourse. Мы могли бы написать:

String name = course.getEnrolledStudent("ST-1").getName();

Мы можем получить доступ к значениям вложенных свойств с помощьюgetNestedProperty и изменить вложенное свойство с помощью методовsetNestedProperty вPropertyUtils. Вот код:

Student student = new Student();
String studentName = "Joe";
student.setName(studentName);

String nameValue
  = (String) PropertyUtils.getNestedProperty(
  course, "enrolledStudent(ST-1).name");

6. Копировать свойства компонента

Копирование свойств одного объекта в другой объект часто утомительно и подвержено ошибкам для разработчиков. BeanUtils class provides a copyProperties method that copies the properties of source object to target object, где имя свойства одинаково в обоих объектах.

Давайте создадим другой класс bean-компонентов какCourse, который мы создали выше, с теми же свойствами, за исключением того, что у него не будет свойстваenrolledStudent, вместо этого имя свойства будетstudents. Назовем этот классCourseEntity. Класс будет выглядеть так:

public class CourseEntity {
    private String name;
    private List codes;
    private Map students = new HashMap<>();

    //  standard getters/setters
}

Теперь скопируем свойства объектаCourse в объектCourseEntity:

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(courseEntity, course);

Помните, что при этом будут скопированы только свойства с тем же именем. Следовательно, он не будет копировать свойствоenrolledStudent в классCourse, потому что в классеCourseEntity нет свойства с таким же именем.

7. Заключение

В этой быстрой статье мы рассмотрели служебные классы, предоставляемыеBeanUtils. Мы также рассмотрели различные типы свойств и как мы можем получить доступ и изменить их значения.

Наконец, мы рассмотрели доступ к вложенным значениям свойств и копирование свойств одного объекта в другой.

Конечно, возможности отражения и самоанализа в Java SDK также позволяют нам динамически получать доступ к свойствам, но это может быть сложно для изучения и требует некоторого стандартного кода. BeanUtils позволяет нам получить доступ и изменить эти значения с помощью одного вызова метода.

Фрагменты кода можно найтиover on GitHub.