Apache Commons BeanUtils

1. Общ преглед

Apache Commons BeansUtils съдържа всички инструменти, необходими за работа с Java зърна.

Най-просто казано, bean е прост Java клас, съдържащ полета, getters / setters и конструктор без аргументи.

Java предоставя възможности за размисъл и интроспекция, за да идентифицира методите за получаване и да ги извиква динамично. Тези API-та обаче могат да бъдат трудни за научаване и може да изискват от разработчиците да напишат шаблонния код, за да извършват най-прости операции.

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

Ето зависимостта на Maven, която трябва да бъде включена във файла POM, преди да го използвате:

 commons-beanutils commons-beanutils 1.9.3 

Най-новата версия можете да намерите тук.

3. Създаване на Java Bean

Нека създадем два курса за боб Курс и Студент с типични методи за гетер и сетер.

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 }

Имаме курс на курс, който има име на курса, кодове на курсове и множество записани студенти. Записаните студенти се идентифицират с уникален идентификационен номер за записване. Курсът поддържа записаните студенти в обект на Карта, където идентификационният код е ключ, а студентският обект ще бъде стойността.

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 като индексирани.

Можем да модифицираме индивидуална стойност на индексирано свойство, използвайки метода setIndexedProperty на PropertyUtils .

Ето примерния код, модифициращ индексираното свойство:

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

4.3. Картиран имот

Всяко свойство, което има java.util.Map като основен тип, се нарича картографирано свойство. BeanUtils ни позволява да актуализираме индивидуалната стойност в карта, използвайки String-стойност ключ.

Ето примерния код за промяна на стойността в картографирано свойство:

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. Копирайте Bean Properties

Копирането на свойства на един обект в друг обект често е досадно и склонно към грешки за разработчиците. Класът BeanUtils предоставя метод copyProperties , който копира свойствата на обекта-източник в целевия обект, където името на свойството е еднакво и в двата обекта.

Нека създадем друг клас на боб като курса, който създадохме по-горе, със същите свойства, с изключение на това, че няма да има свойство studentStudent, а името на свойството ще бъде ученици . Нека назовем този клас 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 в курса клас, защото няма имот със същото име в CourseEntity клас.

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

В тази бърза статия разгледахме класовете на помощните програми, предоставени от BeanUtils . Също така разгледахме различни видове свойства и как можем да осъществим достъп и да променим техните стойности.

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

Разбира се, възможностите за отразяване и самоанализ в Java SDK също ни позволяват да осъществяваме динамичен достъп до свойствата, но може да е трудно да се научим и да изискваме някакъв шаблон. BeanUtils ни позволява да осъществим достъп и да променим тези стойности с едно извикване на метод.

Кодови фрагменти могат да бъдат намерени в GitHub.