BeanUtils de Apache Commons

1. Información general

Apache Commons BeansUtils contiene todas las herramientas necesarias para trabajar con beans de Java.

En pocas palabras, un bean es una clase Java simple que contiene campos, captadores / definidores y un constructor sin argumentos.

Java proporciona capacidades de reflexión e introspección para identificar métodos getter-setter y llamarlos dinámicamente. Sin embargo, estas API pueden ser difíciles de aprender y pueden requerir que los desarrolladores escriban código repetitivo para realizar las operaciones más simples.

2. Dependencias de Maven

Aquí está la dependencia de Maven que debe incluirse en el archivo POM antes de usarlo:

 commons-beanutils commons-beanutils 1.9.3 

La versión más reciente se puede encontrar aquí.

3. Creación de un Java Bean

Creemos dos clases de bean, Curso y Estudiante, con métodos típicos de captador y definidor.

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 }

Tenemos una clase de curso que tiene un nombre de curso, códigos de curso y varios estudiantes inscritos. Los estudiantes inscritos se identifican mediante una identificación de inscripción única. La clase del curso mantiene a los estudiantes inscritos en un objeto de mapa donde la identificación de inscripción es una clave y el objeto de estudiante será el valor.

4. Acceso a la propiedad

Las propiedades del frijol se pueden dividir en tres categorías.

4.1. Propiedad simple

Las propiedades de valor único también se denominan simples o escalares.

Su valor puede ser un objeto de tipo primitivo (como int, float) o complejo. BeanUtils tiene una clase PropertyUtils que nos permite modificar propiedades simples en un Java Bean.

Aquí está el código de ejemplo para establecer las propiedades:

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. Propiedad indexada

Las propiedades indexadas tienen una colección como valor al que se puede acceder individualmente mediante un número de índice. Como una extensión de JavaBean, BeanUtils también considera los valores de tipo java.util.List indexados.

Podemos modificar el valor individual de una propiedad indexada usando el método setIndexedProperty de PropertyUtils .

Aquí hay un código de ejemplo que modifica la propiedad indexada:

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

4.3. Propiedad asignada

Cualquier propiedad que tenga un java.util.Map como tipo subyacente se denomina propiedad mapeada. BeanUtils nos permite actualizar el valor individual en un mapa usando una clave con valor de cadena .

Aquí está el código de ejemplo para modificar el valor en una propiedad asignada:

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

5. Acceso a la propiedad anidada

Si el valor de una propiedad es un objeto y necesitamos acceder a un valor de propiedad dentro de ese objeto, eso sería acceder a una propiedad anidada. PropertyUtils nos permite acceder y modificar propiedades anidadas también.

Supongamos que queremos acceder a la propiedad de nombre de la clase del alumno a través del objeto Curso . Podríamos escribir:

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

Podemos acceder a los valores de propiedad anidados usando getNestedProperty y modificar la propiedad anidada usando métodos setNestedProperty en PropertyUtils . Aquí está el código:

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

6. Copiar propiedades de bean

Copiar propiedades de un objeto a otro objeto suele ser tedioso y propenso a errores para los desarrolladores. La clase BeanUtils proporciona un método copyProperties que copia las propiedades del objeto de origen en el objeto de destino donde el nombre de propiedad es el mismo en ambos objetos.

Creemos otra clase de bean como el curso que creamos anteriormente con las mismas propiedades, excepto que no tendrá la propiedad enrolledStudent en su lugar, el nombre de la propiedad será estudiantes . Llamemos a esa clase CourseEntity . La clase se vería así:

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

Ahora copiaremos las propiedades del objeto Course al objeto 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);

Recuerde que esto copiará las propiedades con el mismo nombre solamente. Por lo tanto, no copiará la propiedad enrolledStudent en la clase del curso porque no hay ninguna propiedad con el mismo nombre en la clase CourseEntity .

7. Conclusión

En este artículo rápido, repasamos las clases de utilidad proporcionadas por BeanUtils . También analizamos diferentes tipos de propiedades y cómo podemos acceder y modificar sus valores.

Finalmente, buscamos acceder a valores de propiedad anidados y copiar propiedades de un objeto a otro objeto.

Por supuesto, las capacidades de reflexión e introspección en el SDK de Java también nos permiten acceder a las propiedades de forma dinámica, pero puede ser difícil de aprender y requerir un código repetitivo. BeanUtils nos permite acceder y modificar estos valores con una sola llamada al método.

Los fragmentos de código se pueden encontrar en GitHub.