Apache Commons BeanUtils
1. Visão geral
O Apache Commons BeansUtils contém todas as ferramentas necessárias para trabalhar com Java beans.
Simplificando, um bean é uma classe Java simples que contém campos, getters / setters e um construtor sem argumentos.
Java fornece recursos de reflexão e introspecção para identificar métodos getter-setter e chamá-los dinamicamente. No entanto, essas APIs podem ser difíceis de aprender e podem exigir que os desenvolvedores escrevam código padrão para executar operações mais simples.
2. Dependências do Maven
Aqui está a dependência do Maven que precisa ser incluída no arquivo POM antes de usá-lo:
commons-beanutils
commons-beanutils
1.9.3
A versão mais recente pode ser encontradahere.
3. Criação de um Java Bean
Vamos criar duas classes de beanCourse eStudent com métodos getter e setter típicos.
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
}
Temos uma classeCourse que tem um nome de curso, códigos de curso e vários alunos matriculados. Os alunos inscritos são identificados por um ID de inscrição exclusivo. A classeCourse mantém alunos matriculados em um objetoMap em que a ID de inscrição é uma chave e o objeto de aluno será o valor.
4. Acesso à Propriedade
As propriedades do bean podem ser divididas em três categorias.
4.1. Propriedade Simples
As propriedades de valor único também são chamadas de simples ou escalares.
Seu valor pode ser um objeto primitivo (como int, float) ou complexo. BeanUtils tem uma classePropertyUtils que nos permite modificar propriedades simples em um Java Bean.
Aqui está o código de exemplo para definir as propriedades:
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. Propriedade indexada
As propriedades indexadas têm uma coleção como um valor que pode ser acessado individualmente usando um número de índice. Como uma extensão do JavaBean, o BeanUtils considera os valores de tipojava.util.List como indexados também.
Podemos modificar um valor individual de propriedade indexada usando um métodoPropertyUtils’ssetIndexedProperty.
Aqui está um exemplo de código que modifica a propriedade indexada:
PropertyUtils.setIndexedProperty(course, "codes[1]", "CS02");
4.3. Propriedade mapeada
Qualquer propriedade que tenhajava.util.Map como tipo subjacente é chamada de propriedade mapeada. O BeanUtils nos permite atualizar o valor individual em um mapa usando uma chaveString-valued.
Aqui está o código de exemplo para modificar o valor em uma propriedade mapeada:
Student student = new Student();
String studentName = "Joe";
student.setName(studentName);
PropertyUtils.setMappedProperty(course, "enrolledStudent(ST-1)", student);
5. Acesso de propriedade aninhada
Se um valor de propriedade for um objeto e precisarmos acessar um valor de propriedade dentro desse objeto - isso estaria acessando uma propriedade aninhada. PropertyUtils nos permite acessar emodify nested properties também.
Suponha que queremos acessar a propriedade name da classeStudent por meio do objetoCourse. Podemos escrever:
String name = course.getEnrolledStudent("ST-1").getName();
Podemos acessar os valores da propriedade aninhada usandogetNestedPropertye modificar a propriedade aninhada usando os métodossetNestedProperty emPropertyUtils. Aqui está o código:
Student student = new Student();
String studentName = "Joe";
student.setName(studentName);
String nameValue
= (String) PropertyUtils.getNestedProperty(
course, "enrolledStudent(ST-1).name");
6. Copiar propriedades do feijão
Copiar propriedades de um objeto para outro objeto geralmente é tedioso e propenso a erros para os desenvolvedores. BeanUtils class provides a copyProperties method that copies the properties of source object to target object em que o nome da propriedade é o mesmo em ambos os objetos.
Vamos criar outra classe de bean comoCourse que criamos acima com as mesmas propriedades, exceto que não terá a propriedadeenrolledStudent em vez do nome da propriedade serástudents. Vamos nomear essa classeCourseEntity. A classe teria a seguinte aparência:
public class CourseEntity {
private String name;
private List codes;
private Map students = new HashMap<>();
// standard getters/setters
}
Agora vamos copiar as propriedades do objetoCourse para o objetoCourseEntity:
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);
Lembre-se de que isso copiará as propriedades apenas com o mesmo nome. Portanto, ele não copiará a propriedadeenrolledStudent na classeCourse porque não há nenhuma propriedade com o mesmo nome na classeCourseEntity.
7. Conclusão
Neste artigo rápido, examinamos as classes de utilitários fornecidas porBeanUtils. Também analisamos diferentes tipos de propriedades e como podemos acessar e modificar seus valores.
Por fim, analisamos o acesso aos valores das propriedades aninhadas e a cópia das propriedades de um objeto para outro.
Obviamente, os recursos de reflexão e introspecção no Java SDK também nos permitem acessar propriedades dinamicamente, mas pode ser difícil aprender e exigir algum código padrão. BeanUtils nos permite acessar e modificar esses valores com uma única chamada de método.
Trechos de código podem ser encontradosover on GitHub.