Перейти к основному содержимому

Apache Commons BeanUtils

· 4 мин. чтения

1. Обзор

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

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

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

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

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

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>

Новейшую версию можно найти здесь .

3. Создание Java-бина

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

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
}

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

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

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

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

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

Их значения могут быть примитивными (например, int, float) или объектами сложного типа. BeanUtils имеет класс PropertyUtils , который позволяет нам изменять простые свойства в Java 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);

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

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

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

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

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

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

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

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

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

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

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

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

Предположим, мы хотим получить доступ к свойству 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 предоставляет метод copyProperties , который копирует свойства исходного объекта в целевой объект , где имя свойства одинаково в обоих объектах.

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

public class CourseEntity {
private String name;
private List<String> codes;
private Map<String, Student> 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 позволяет нам получать доступ к этим значениям и изменять их с помощью одного вызова метода.

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