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.