Beruflich Dokumente
Kultur Dokumente
Examinar Estrutura
Objeto de tipo
desconhecido
Introspeco
Reflexo
Modificar Estrutura e
Comportamento
O exemplo de introspeco abaixo, mostra como o operador instanceof determina se um objeto
pertence a uma classe particular.
// Com introspection
if(obj instanceof Pessoa){
Pessoa p = (Pessoa)obj;
p.fala();
}
O exemplo de reflexo abaixo, mostra o uso do mtodo Class.forName() que retorna o objeto
associado com uma classe ou interface e cujo nome foi dado (uma string contendo o nome e o
path). O mtodo forName invoca a classe a ser inicializada.
// com reflection
Class<?> c = Class.forName("classpath.and.classname");
Object Pesoa = c.newInstance();
Method m = c.getDeclaredMethod("fala", new
Class<?>[0]);
m.invoke(pessoa);
Em Java, a reflexo mais abrangente do que a introspeco, porque pode-se com ela alterar a
estrutura de um objeto. Existem algumas APIs para mudar os modificadores de acesso de
mtodos e atributos, mas no de estruturas.
A reflexo tem uso muito comum entre os frameworks. Por exemplo: JUnit usa reflexo para
identificar os mtodos com a anotao (@)Teste para cham-los quando estiver executando
testes unitrios.
Para desenvolvedores WEB usado para definir a sua prpria implementao de interfaces e
classes e colocar nos arquivos de configurao. O uso de reflexo, pode de forma rpida e
dinmica inicializar as classes necessrias para a aplicao.
Por exemplo, o framework Spring usa reflexo para a configurao de beans. Veja como:
import java.lang.reflect.Constructor;
public class Reflexao4 {
public static void main(String[] args) {
try {
Class cls = Class.forName("java.awt.Panel");
System.out.println("Constructores de Panel =");
/* returna um array Constructor com objetos representando os
construtores da classe */
Constructor c[] = cls.getConstructors();
for (Constructor c1 : c) {
System.out.println(c1);
}
}
catch (ClassNotFoundException | SecurityException e) {
System.out.println("Exception: " + e);
}
}
}