A informática está cada dia mais presente na vida das pessoas. A utilização de aplicações para as mais diversas finalidades tem aumentado, e conseqüentemente a exigência de funcionalidades por seus usuários. A necessidade de funcionalidades muito específicas e/ou em maior número, podem tornar o seu desenvolvimento inviável para a empresa responsável pela aplicação. Uma alternativa para viabilizar o desenvolvimento destas funcionalidades é permitir que estas sejam criadas por terceiros e acopladas à aplicação. Muitos aplicativos permitem a extensão de funcionalidades através da utilização de módulos externos, chamados de plug-ins, que são acoplados a uma aplicação-base. Um exemplo muito conhecido é o navegador Firefox. No site deste navegador é possível encontrar diversas funcionalidades implementadas por desenvolvedores do mundo inteiro. Esta extensão pode ser permitida em aplicativos Java através da utilização da reflexão de classes.

O que é reflexão?

Reflexão é um recurso da API Java que possibilita aos aplicativos o acesso e a modificação do comportamento de aplicações que estão rodando na Java Virtual Machine. Uma classe pode acessar outras classes em tempo de execução, sem conhecer sua definição no momento da compilação. Informações relativas à esta definição, como seus construtores, métodos e atributos, podem ser facilmente acessados através de métodos de reflexão da API Java. Classes externas à aplicação, que não foram compiladas junto a mesma, podem ser instanciadas para utilização de seus recursos. Os recursos de reflexão oferecidos pela API Java, na maioria dos casos, são utilizados para prover extensão de funcionalidades a aplicações, desenvolvimento de ferramentas de debug e aplicativos que permitem a navegação no conteúdo de classes compiladas.

Para todo tipo de objeto, a Java Virtual Machine cria uma instância imutável de java.lang.Class, que provê métodos para examinar as propriedades do objeto em tempo de execução. Esta classe é o ponto de partida para trabalhar com reflexão.

Veremos primeiro como obter um objeto Class, e depois como utilizá-lo para instanciar objetos dinamicamente. Leitores que já possuem familiaridade com a API de reflexão podem pular para a seção Desenvolvendo uma aplicação, na qual mostraremos como exemplo uma aplicação que suporta plug-ins através da reflexão de classes.

Utilizando objetos Class

O método getClass() da classe Object retorna a classe de um determinado objeto em tempo de execução. Na expressão a seguir o método getClass() retorna o Class para o tipo String:

   Class c = "Java Magazine".getClass();

Se não há uma instância disponível para obtenção da classe, mas o tipo é conhecido, então pode ser utilizado a sintaxe .class. Esta também permite obter o Class relacionado a tipos primitivos.

   Class c1 = boolean.class;
   Class c2 = java.io.PrintStream.class;
...

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo