Apache Commons BeanUtils

1. Übersicht

Apache Commons BeansUtils enthält alle Tools, die für die Arbeit mit Java-Beans erforderlich sind.

Einfach ausgedrückt ist eine 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. Diese APIs können jedoch schwierig zu erlernen sein und erfordern möglicherweise, dass Entwickler Boilerplate-Code schreiben, um einfachste Vorgänge auszuführen.

2. Maven-Abhängigkeiten

Hier ist die Maven-Abhängigkeit, die vor der Verwendung in die POM-Datei aufgenommen werden muss:

 commons-beanutils commons-beanutils 1.9.3 

Die neueste Version finden Sie hier.

3. Erstellen einer Java Bean

Lassen Sie uns zwei Bean-Klassen Course und Student mit typischen Getter- und Setter-Methoden erstellen .

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 eine Kursklasse mit einem Kursnamen, Kurscodes und mehreren eingeschriebenen Studenten. Eingeschriebene Schüler werden durch eine eindeutige Einschreibungs-ID identifiziert. In der Kursklasse werden eingeschriebene Schüler in einem Kartenobjekt verwaltet , in dem die Anmelde-ID ein Schlüssel ist und das Schülerobjekt der Wert ist.

4. Zugang zum Eigentum

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

4.1. Einfache Eigenschaft

Einwertige Eigenschaften werden auch als einfach oder skalar bezeichnet.

Ihr Wert kann ein primitives (wie int, float) oder komplexes Objekt sein. BeanUtils verfügt über eine PropertyUtils- 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 Sammlung als Wert, auf die über eine Indexnummer einzeln zugegriffen werden kann. Als Erweiterung von JavaBean betrachtet BeanUtils auch die Werte des Typs java.util.List als indiziert.

Wir können einen indizierten Eigenschaftswert mithilfe der setIndexedProperty- Methode von PropertyUtils ä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 Typ eine java.util.Map hat, wird als zugeordnete Eigenschaft bezeichnet. Mit BeanUtils können wir den einzelnen Wert in einer Map mithilfe eines Schlüssels mit String-Wert 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. Verschachtelter Eigentumszugriff

Wenn ein Eigenschaftswert ein Objekt ist und wir auf einen Eigenschaftswert innerhalb dieses Objekts zugreifen müssen, würde dies auf eine verschachtelte Eigenschaft zugreifen. Mit PropertyUtils können wir auch auf verschachtelte Eigenschaften zugreifen und diese ändern .

Angenommen , wir den Namen Eigenschaft zugreifen möchten Schülerklasse durch Kurs Objekt. Wir könnten schreiben:

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

Wir können mit getNestedProperty auf die verschachtelten Eigenschaftswerte zugreifen und die verschachtelte Eigenschaft mit setNestedProperty- Methoden in PropertyUtils ä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. Kopieren Sie die Bean-Eigenschaften

Das Kopieren von Eigenschaften eines Objekts in ein anderes Objekt ist für Entwickler häufig mühsam und fehleranfällig. Die BeanUtils- Klasse bietet eine copyProperties- Methode, mit der die Eigenschaften des Quellobjekts in das Zielobjekt kopiert werden, wobei der Eigenschaftsname in beiden Objekten identisch ist.

Lassen Sie uns erstellen Sie eine andere Bean - Klasse als Course wir oben mit gleichen Eigenschaften , außer es erstellt werden nicht haben enrolledStudent Eigenschaft statt Eigenschaftsname wird Studenten . Nennen wir diese Klasse CourseEntity . Die Klasse würde aussehen wie:

public class CourseEntity { private String name; private List codes; private Map students = new HashMap(); // standard getters/setters }

Jetzt werden wir die Eigenschaften kopieren Course Objekt CourseEntity Objekt:

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 dadurch nur die Eigenschaften mit demselben Namen kopiert werden. Deshalb wird es nicht kopieren Sie die Eigenschaft enrolledStudent in Course Klasse , weil es keine Eigenschaft mit dem gleichen Namen in ist CourseEntity Klasse.

7. Fazit

In diesem kurzen Artikel haben wir die von BeanUtils bereitgestellten Dienstprogrammklassen besprochen . Wir haben uns auch verschiedene Arten von Eigenschaften angesehen und wie wir auf deren Werte zugreifen und diese ä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 ermöglichen uns die Reflexions- und Introspektionsfunktionen im Java SDK auch den dynamischen Zugriff auf Eigenschaften, aber es kann schwierig sein, etwas zu lernen, und es ist ein Teil des Boilerplate-Codes erforderlich. Mit BeanUtils können wir mit einem einzigen Methodenaufruf auf diese Werte zugreifen und sie ändern.

Code-Schnipsel finden Sie auf GitHub.