Nesta aula, apresentamos a solução do exercício da aula de reflection, mostrando um caso prático e real do uso da tecnologia.
O exercício propunha a criação de uma tabela, em modo texto, que imprimisse os dados de uma lista contendo um objeto de uma classe qualquer. É importante destacar que um dos objetivos desse desafio era separar duas lógicas:
- A do desenho da tabela
- A dos dados que a tabela contém
Ou seja, a classe que desenha a tabela deve ser capaz de se adaptar a diferentes fontes de dados, sem que as classes de negócio pertencentes a essa fonte precisem implementar uma interface ou fornecer métodos para isso.
Ao mesmo tempo, deve-se permitir ao usuário configurar regras de formatação e quais campos da classe serão impressos. Por fim o exercício pede para gerar duas tabelas, com duas fontes de dados distintas, contendo classes não relacionadas.
A solução se deu utilizando o recurso de Reflection. Esse recurso permite inspecionar uma classe, perguntando a ela quais atributos ou métodos possuem. Este uso é feito no método inspect da classe Table.
Observe nesse método o uso do método getClass() e de classes como Class e Field.
Foi criada as anotations @Column e @Header que permitem marcar quais campos da classe irão aparecer na tabela e quais terão cabeçalho impresso. Além disso, as anotações permitem definir configurações. Observe novamente o método inspect para verificar seu uso.
As informações são usadas para gerar objetos da classe TableColumn que são posteriormente usados para desenhar a tabela.
Verifique também a resolução deste problema sem o uso do recurso de annotations, através do padrão DataMapper (DataSource).