Apache Commons BeanUtils

Apache Commons BeanUtils

1. Überblick

Apache Commons BeansUtils enthält alle Tools, die zum Arbeiten mit Java-Beans erforderlich sind.

Einfach ausgedrückt ist ein Bean eine einfache Java-Klasse, die Felder, Getter / Setter und einen Konstruktor ohne Argumente enthält.

Java bietet Reflexions- und Introspektionsfunktionen, um Getter-Setter-Methoden zu identifizieren und dynamisch aufzurufen. Es kann jedoch schwierig sein, diese APIs zu erlernen, und es kann erforderlich sein, dass Entwickler Boilerplate-Code schreiben, um einfachste Vorgänge auszuführen.

2. Maven-Abhängigkeiten

Hier ist die Maven-Abhängigkeit, die in die POM-Datei aufgenommen werden muss, bevor sie verwendet werden kann:


    commons-beanutils
    commons-beanutils
    1.9.3

Die neueste Version finden Sie inhere.

3. Erstellen einer Java Bean

Erstellen wir zwei Bean-KlassenCourse undStudent mit typischen Getter- und Setter-Methoden.

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
}

Wir haben eineCourse-Klasse mit einem Kursnamen, Kurscodes und mehreren eingeschriebenen Studenten. Eingeschriebene Schüler werden durch eine eindeutige Anmelde-ID identifiziert. Die Klasse vonCourseverwaltet eingeschriebene Schüler in einemMap-Objekt, in dem die Einschreibungs-ID ein Schlüssel ist und das Schülerobjekt der Wert ist.

4. Eigentumszugang

Bean-Eigenschaften können in drei Kategorien unterteilt werden.

4.1. Einfache Eigenschaft

Einzelwerteigenschaften werden auch als einfach oder skalar bezeichnet.

Ihr Wert kann ein primitives (wie int, float) oder komplexes Objekt sein. BeanUtils hat einePropertyUtils-Klasse, mit der wir einfache Eigenschaften in einer Java Bean ändern können.

Hier ist der Beispielcode zum Festlegen der Eigenschaften:

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. Indizierte Eigenschaft

Indizierte Eigenschaften haben eine Auflistung als Wert, auf die über eine Indexnummer einzeln zugegriffen werden kann. Als Erweiterung von JavaBean betrachtet BeanUtils auch die Typwerte vonjava.util.Listals indiziert.

Wir können einen indizierten Eigenschaftswert mit der MethodePropertyUtils’ssetIndexedProperty ändern.

Hier ist ein Beispielcode zum Ändern der indizierten Eigenschaft:

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

4.3. Zugeordnetes Eigentum

Jede Eigenschaft, deren zugrunde liegender Typjava.util.Map enthält, wird als zugeordnete Eigenschaft bezeichnet. Mit BeanUtils können wir den einzelnen Wert in einer Karte mit einemString-valued-Schlüssel aktualisieren.

Hier ist der Beispielcode zum Ändern des Werts in einer zugeordneten Eigenschaft:

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

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

5. Zugriff auf verschachtelte Objekte

Wenn ein Eigenschaftswert ein Objekt ist und auf einen Eigenschaftswert in diesem Objekt zugegriffen werden muss, wird auf eine verschachtelte Eigenschaft zugegriffen. PropertyUtils ermöglichen uns den Zugriff undmodify nested properties auch.

Angenommen, wir möchten über das ObjektCourseauf die Eigenschaft name der KlasseStudentzugreifen. Wir könnten schreiben:

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

Wir können mitgetNestedProperty auf die verschachtelten Eigenschaftswerte zugreifen und die verschachtelte Eigenschaft mitsetNestedProperty Methoden inPropertyUtils ändern. Hier ist der Code:

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

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

6. Bean-Eigenschaften kopieren

Das Kopieren von Eigenschaften eines Objekts in ein anderes Objekt ist für Entwickler oft mühsam und fehleranfällig. BeanUtils class provides a copyProperties method that copies the properties of source object to target object, wobei der Eigenschaftsname in beiden Objekten gleich ist.

Erstellen wir eine weitere Bean-Klasse alsCourse, die wir oben mit denselben Eigenschaften erstellt haben, außer dass sie nicht die EigenschaftenrolledStudenthat, sondern der Eigenschaftsnamestudents. Nennen wir diese KlasseCourseEntity. Die Klasse würde so aussehen:

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

    //  standard getters/setters
}

Jetzt kopieren wir die Eigenschaften des Objekts vonCoursein das Objekt vonCourseEntity:

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);

Denken Sie daran, dass hierdurch nur die Eigenschaften mit demselben Namen kopiert werden. Daher wird die EigenschaftenrolledStudent in der KlasseCoursenicht kopiert, da in der KlasseCourseEntitykeine Eigenschaft mit demselben Namen vorhanden ist.

7. Fazit

In diesem kurzen Artikel haben wir die Dienstprogrammklassen vonBeanUtils besprochen. Wir haben uns auch verschiedene Arten von Eigenschaften angesehen und wie wir auf ihre Werte zugreifen und sie ändern können.

Schließlich haben wir uns mit dem Zugriff auf verschachtelte Eigenschaftswerte und dem Kopieren von Eigenschaften eines Objekts in ein anderes Objekt befasst.

Natürlich können wir dank der Reflektions- und Introspektionsfunktionen im Java SDK auch dynamisch auf Eigenschaften zugreifen, aber es kann schwierig sein, diese zu erlernen und einige Boilerplate-Codes zu benötigen. MitBeanUtils können wir mit einem einzigen Methodenaufruf auf diese Werte zugreifen und sie ändern.

Code-Schnipsel könnenover on GitHub gefunden werden.