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.