Reflexao

14 respostas
J
Boa noite pessoal.. estou com uma dificuldade em invocar o metodo set e passar valores:
String set = method.getName().substring(0, 3);
                if (set.equals("set")) {
                  
                
                }
noo codigo acima eu ja capturei os metodos set do Objeto passsado.. agora e como faço para pegar o objeto e passar os metodos set e valores para ele? exemplo.. objeto T; metod setNome; como que posso fazer isso : T.setNome..passando parametros

grato.

14 Respostas

Eric_Yuzo

Você pode utilizar o método invoke. Ele recebe um Object que representa o objeto que vai invocar o método e um vararg de Object que representam os parâmetros passados.

method.invoke(caller, arg1, arg2, argn); //caller é o objeto que vai invocar o método e os args são os parâmetros. //Isto tem o efeito de caller.nomeDoMetodo(arg1, arg2, argn);
Só lembre que se o método não for acessível pelo objeto que for passado será disparada uma exceção a menos que você torne o método acessível:

method.setAccessible(true);
Mikhas

Criei uma pequena biblioteca que ajuda com Reflection se interessar: http://code.google.com/p/mikhas/wiki/Refractor

josue_carrecon

Pergunta: voce usa o reflection no dia a dia pra manipulação de campos, tava pesquisando sobre isso e foi desemcorajado, gostaria de mais imformações sobre isso.

J

quando eu executo da o seguinte erro:

SEVERE: null
java.lang.IllegalArgumentException: argument type mismatch

zoren

Você está passando o tipo incorreto para o método

coloca ai seu código

J

consegui arrumar…agora to com outro probleminha…eu passo uma lista de textField, dae eu pego por exemplo…

lista.get(0).getText();
porem o tipo pode ser int, como que vou distinguir esses valores…sendo que qndo uso o getText() ele tranforma tudo em string …grato.

J

não teria outra maneira para verificar o tipo do parametro do metodo

Method[] metodos = cl.getDeclaredMethods();
        for (Method method : metodos) {
//aqui eu varo todos os metodos da classe..
// como que faço para saber o tipo do parametro.. se é int, boolean ....????????


}
mesmo asssim obrigado pessoal pelas dicas..foram todas uteis.. se alguem puder me ajudar ..
J

certo agora eu já consigo pegar o retorno que é VOID, agora como que faço para saber o parametro passado no metodo…?

por exemplo…
public void setAno(int){} como que pego o INT?

J

consegui…
Class[] classs = method.getParameterTypes();

Ataxexe

Pergunta: voce usa o reflection no dia a dia pra manipulação de campos, tava pesquisando sobre isso e foi desemcorajado, gostaria de mais imformações sobre isso.

Acho estranho isso ser desencorajado. Praticamente todos os frameworks fazem dessa forma. Poderia apontar onde você viu a respeito? Fiquei bastante curioso com essa afirmação.

O que não se deve é usar Reflection pra qualquer coisa. Geralmente usamos Reflection para generalização, daí o fato de ele ser amplamente usado em frameworks.

Se você está desenvolvendo um código com uma regra de negócio dificilmente irá usar Reflection pra manipular algum campo.

Mikhas

A biblioteca faz um tanto mais de coisas, mas fiquei com um pouco de preguiça de escrever mais exemplos. Vou gerar o javadoc para ajudar.

Sobre metodos, da para fazer coisas como:

// Lista os metodos do meu objeto
	Refractor.reflect(MEU_OBJETO).methods();
	// Invoca metodo sem ter conhecimento dos tipos dos parametros
	Refractor.reflect(MEU_OBJETO).method("setNome").invoke("Mikhail");
	// Invoca metodo com tipo de parametro especificado
	Refractor.reflect(MEU_OBJETO).method("setNome",String.class).invoke("Mikhail");
	// Invoca um metodo sem parametros
	Refractor.reflect(MEU_OBJETO).method("destroy").invoke();
	// Lista as annotations de um metodo chamado "init" que não possui argumentos/parametros
	Refractor.reflect(MEU_OBJETO).method("init").withoutArgs().annotations();

Normalmente eu não uso reflection no dia-a-dia, apenas quando preciso criar algum componente mais dinamico e complexo, ai vem a calhar.

WellingtonRamos

Você pode usar uma expressão regular buscando por qualquer coisa que não seja número. Se retornar uma String vazia, significa que é número e você pode fazer um parse ou pode simplesmente fazer um parse para inteiro (crie um método para isso). Se der parseException, o valro utilizado não é numérico.
PS: Eu desencorajo qualquer tentativa de usar exceções como se fosse um if mas se precisar de uma solução rápida…

WellingtonRamos

Mikhas, não vi pelos exemplos, muitas vantagens em usar a biblioteca em relação ao uso direto da API Java.

josue carrecon, não é que o uso é desencorajado, é que, se você têm acesso aos métodos públicos de uma determinada classe, não há porque utilizar reflexão. Seu uso é específico, normalmente para automações de ações (como ler um XML e atribuir os valores obtidos automaticamente a um objeto).

WellingtonRamos

Method m; m.getReturnType()

http://download.oracle.com/javase/6/docs/technotes/guides/reflection/index.html

Criado 16 de novembro de 2010
Ultima resposta 17 de nov. de 2010
Respostas 14
Participantes 7