domingo, 20 de março de 2011

Dicas de Programação: Chamando uma classe dinamicamente em Java

Isso é bem estranho... Mas é possível usar um objeto de uma classe sem importar e/ou declarar ela. (vamos usar, em Java, o que chamamos de reflexão :) )

Por exemplo, quero usar a classe Vector e adicionar uma String nela, mas não desejo importa-la ou declara-la explicitamente.

O primeiro passo é usar o método estático forName da classe Class, passando como argumento uma String com o nome do pacote e da classe que quero usar:

Class clazz = Class.forName("java.util.Vector");

Agora, quero criar uma instância de Vector:

Object obj = clazz.newInstance();

Coloquei em obj, que é um objeto (variável) da classe Object, que toda classe herda (o chamado classe "genérica", que aceita de tudo :P ).
Vamos obter o método add do objeto Vector:

Method method = clazz.getMethod("add", Object.class);

A instrução acima, obtem o método a ser chamado (no caso, o método chamado "add"), sendo o primeiro parametro é o nome do método, e os demais parametros (opcionais) são as classes dos parametros deste método.
Ixi... Agora complicou! :P
Acho melhor passar um exemplo... Se um método é declarado assim:

public void escreve(String s1, String s2) {
...
}

Para chama-lo, você deve fazer assim:

clazz.getMethod("escreve",String.class, String.class);

Ou seja, se tem dois argumentos do "tipo" String, então passo estas classes no getMethod.

Vamos executar o método que temos, através do método invoke:

method.invoke(obj, "Teste");

O primeiro argumento, é o objeto/instância da classe, e o segundo valor passado é o valor do parametro do método "add". Ou seja, isso é como se eu estivesse fazendo:

((Vector)obj).add("Teste");

Agora, para ver se deu certo, eu mando escrever o objeto:

System.out.println(obj.getClass().getName() + ".toString() = " + obj);

Deve aparecer a String "java.util.Vector.toString() = [Teste]"

Putz, que coisa estranha...

Até mais!

Nenhum comentário: