Apache Commons BeanUtils

Apache Commons BeanUtils

1. Vue d'ensemble

Apache Commons BeansUtils contient tous les outils nécessaires pour travailler avec des 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 fonctionnalités de réflexion et d’introspection permettant d’identifier les méthodes d’appeleur et de 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 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éehere.

3. Créer un Java Bean

Créons deux classes de beanCourse etStudent avec des méthodes classiques de lecture et de définition.

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 classeCourse 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 classeCourse gère les étudiants inscrits dans un objetMap 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 une primitive (telle que int, float) ou des objets de type complexe. BeanUtils a une classePropertyUtils 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 qui peut être consultée individuellement à l'aide d'un numéro d'index. En tant qu'extension de JavaBean, BeanUtils considère également les valeurs de typejava.util.List comme indexées.

Nous pouvons modifier une valeur individuelle de propriété indexée en utilisant une méthodePropertyUtils’ssetIndexedProperty.

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

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

4.3. Propriété mappée

Toute propriété qui a unjava.util.Map comme type sous-jacent est appelée propriété mappée. BeanUtils nous permet de mettre à jour la valeur individuelle dans une carte en utilisant une cléString-valued.

Voici l'exemple de code permettant de modifier la valeur dans 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 devons accéder à une valeur de propriété à l'intérieur de cet objet, elle accéderait à une propriété imbriquée. PropertyUtils nous permettent également d'accéder auxmodify nested properties.

Supposons que nous souhaitons accéder à la propriété name de la classeStudent via l'objetCourse. Nous pourrions écrire:

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

Nous pouvons accéder aux valeurs des propriétés imbriquées en utilisantgetNestedProperty et modifier la propriété imbriquée en utilisant les méthodessetNestedProperty dansPropertyUtils. 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

Copier les propriétés d'un objet dans un autre est souvent fastidieux et source d'erreurs pour les développeurs. BeanUtils class provides a copyProperties method that copies the properties of source object to target object où le nom de propriété est le même dans les deux objets.

Créons une autre classe de bean commeCourse que nous avons créée ci-dessus avec les mêmes propriétés sauf qu’elle n’aura pas la propriétéenrolledStudent à la place le nom de propriété serastudents. Nommons cette classeCourseEntity. La classe ressemblerait à:

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

    //  standard getters/setters
}

Maintenant, nous allons copier les propriétés de l'objetCourse dans l'objetCourseEntity:

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 uniquement les propriétés portant le même nom. Par conséquent, il ne copiera pas la propriétéenrolledStudent dans la classeCourse car il n'y a pas de propriété avec le même nom dans la classeCourseEntity.

7. Conclusion

Dans cet article rapide, nous avons passé en revue les classes d'utilité fournies parBeanUtils. Nous avons également examiné différents types de propriétés et comment nous pouvons accéder à leurs valeurs et les modifier.

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

Bien entendu, les fonctionnalités de réflexion et d’introspection dans le SDK Java nous permettent également d’accéder aux propriétés de manière dynamique, mais il peut être difficile à maîtriser et nécessite du code standard. BeanUtils nous permet d'accéder et de modifier ces valeurs avec un seul appel de méthode.

Des extraits de code peuvent être trouvésover on GitHub.