Java Reflection: um exemplo prático

Reflexão (reflection) é uma característica que permite a um programa observar e até modificar a sua estrutura e o seu comportamento interno.

Os termos comumente utilizados são reflexão e introspecção. Na reflexão, um programa observa e modifica seu comportamento enquanto que na introspecção ele apenas observa e obtém informações dele mesmo.

A linguagem Java possui uma API de reflection que, na verdade, possui muito mais características de introspecção do que reflexão. Essa API possibilita o acesso a propriedades de classes, métodos e informações de anotações em tempo de execução. Esse mecanismo permite a um programa Java modificar o seu comportamento de acordo com as informações contidas na classe, tornando o programa muito mais flexível.

A princípio os conceitos de reflection parecem muito complexos, abstratos e sem perspectiva para aplicação prática, mas esses recursos são muito utilizados no desenvolvimento de frameworks e podem trazer também muitos benefícios no desenvolvimento de aplicações enterprise.

A seguir é apresentado um exemplo onde a reflection é utilizada para obter todas as propriedades de um objeto que podem ser acessadas por métodos get.

As classes a seguir são dois pojos, Product e Person, que terão suas propriedades expostas por meio de métodos get recuperadas por meio de reflection.

A classe a seguir, ReflectionMapper, possui o método getAttributesMap que recebe como parâmetro um Object e retorna todas as propriedade do objeto que possam ser acessadas por um método get. O método obtém uma lista com todos os Method do objeto passado como parâmetro e, para cada método, verifica se o mesmo possui as características de um método get, se tiver, invoca-o e coloca o retorno em um Map para retorno.

A classe ReflectionTest utiliza o método getAttributesMap de ReflectionMapper. Note como esse código é elegante, permitindo o acesso a todas as propriedades de um objeto em poucas linhas de código. Independente do número de propriedades da classe, o acesso será feito com o mesmo número de linhas de código, sem a ncessidade de inúmeras chamadas a métodos get diretamente no objeto.

Os exemplos apresentados aqui mostram o funcionamento da Reflection API de Java e como técnicas de programação voltadas a introspecção e reflexão podem transformar código repetitivo em códigos reutilizável. Há muito mais sobre a Reflection API para explorar, consulte também o tutorial oficial da Oracle sobre Reflection API.