Apache Commons BeanUtils

1. Vue d'ensemble

Apache Commons BeansUtils contient tous les outils nécessaires pour travailler avec les beans Java.

En termes simples, un bean est une simple classe Java contenant des champs, des getters / setters et un constructeur sans argument.

Java fournit des capacités de réflexion et d'introspection pour identifier les méthodes getter-setter et les appeler de manière dynamique. Cependant, ces API peuvent être difficiles à apprendre et peuvent obliger les développeurs à écrire du code standard pour effectuer les opérations les plus simples.

2. Dépendances de Maven

Voici la dépendance Maven qui doit être incluse dans le fichier POM avant de l'utiliser:

 commons-beanutils commons-beanutils 1.9.3 

La dernière version peut être trouvée ici.

3. Création d'un Java Bean

Créons deux classes de bean Course et Student avec des méthodes getter et setter typiques.

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 }

Nous avons une classe de cours qui a un nom de cours, des codes de cours et plusieurs étudiants inscrits. Les étudiants inscrits sont identifiés par un identifiant d'inscription unique. La classe de cours conserve les étudiants inscrits dans un objet Map où l'ID d'inscription est une clé et l'objet étudiant sera la valeur.

4. Accès à la propriété

Les propriétés des haricots peuvent être divisées en trois catégories.

4.1. Propriété simple

Les propriétés à valeur unique sont également appelées simples ou scalaires.

Leur valeur peut être un objet de type primitif (comme int, float) ou complexe. BeanUtils a une classe PropertyUtils qui nous permet de modifier des propriétés simples dans un Java Bean.

Voici l'exemple de code pour définir les propriétés:

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. Propriété indexée

Les propriétés indexées ont une collection en tant que valeur accessible individuellement à l'aide d'un numéro d'index. En tant qu'extension de JavaBean, BeanUtils considère les valeurs de type java.util.List comme indexées également.

Nous pouvons modifier une valeur individuelle de propriété indexée à l'aide de la méthode setIndexedProperty de PropertyUtils .

Voici un exemple de code modifiant la propriété indexée:

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

4.3. Propriété mappée

Toute propriété dont le type sous-jacent est java.util.Map est appelée propriété mappée. BeanUtils nous permet de mettre à jour la valeur individuelle dans une carte à l'aide d'une clé à valeur de chaîne .

Voici l'exemple de code pour modifier la valeur d'une propriété mappée:

Student student = new Student(); String studentName = "Joe"; student.setName(studentName); PropertyUtils.setMappedProperty(course, "enrolledStudent(ST-1)", student);

5. Accès aux propriétés imbriquées

Si une valeur de propriété est un objet et que nous avons besoin d'accéder à une valeur de propriété à l'intérieur de cet objet, cela donnerait accès à une propriété imbriquée. PropertyUtils nous permet également d'accéder aux propriétés imbriquées et de les modifier .

Supposons que nous souhaitons accéder à la propriété name de la classe Student via l' objet Course . Nous pourrions écrire:

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

Nous pouvons accéder aux valeurs de propriété imbriquées à l'aide de getNestedProperty et modifier la propriété imbriquée à l'aide des méthodes setNestedProperty dans PropertyUtils . Voici le code:

Student student = new Student(); String studentName = "Joe"; student.setName(studentName); String nameValue = (String) PropertyUtils.getNestedProperty( course, "enrolledStudent(ST-1).name");

6. Copier les propriétés du bean

La copie des propriétés d'un objet vers un autre objet est souvent fastidieuse et source d'erreurs pour les développeurs. La classe BeanUtils fournit une méthode copyProperties qui copie les propriétés de l'objet source vers l'objet cible où le nom de propriété est le même dans les deux objets.

Créons une autre classe de bean comme Course que nous avons créée ci-dessus avec les mêmes propriétés sauf qu'elle n'aura pas la propriété registeredStudent au lieu de cela le nom de la propriété sera des étudiants . Appelons cette classe CourseEntity . La classe ressemblerait à:

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

Nous allons maintenant copier les propriétés de l' objet Course dans l' objet 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);

N'oubliez pas que cela copiera les propriétés avec le même nom uniquement. Par conséquent, il ne copiera pas la propriété registeredStudent dans la classe Course car il n'y a pas de propriété avec le même nom dans la classe CourseEntity .

7. Conclusion

Dans cet article rapide, nous avons passé en revue les classes utilitaires fournies par BeanUtils . Nous avons également examiné différents types de propriétés et comment pouvons-nous accéder et modifier leurs valeurs.

Enfin, nous avons examiné l'accès aux valeurs de propriété imbriquées et la copie des propriétés d'un objet vers un autre objet.

Bien sûr, les capacités de réflexion et d'introspection du SDK Java nous permettent également d'accéder aux propriétés de manière dynamique, mais cela peut être difficile à apprendre et nécessiter un code standard. BeanUtils nous permet d'accéder et de modifier ces valeurs avec un seul appel de méthode.

Des extraits de code sont disponibles à l'adresse over sur GitHub.