Problemas Reflection + métodos overloaded

5 respostas
GraveDigger

E ae galera, blz?

Seguinte, estou tentando, através de reflection, executar um método overloaded, porém, um método recebe um int, o outro uma string.

Quando tento passar a string, me retorna um argumet type mysmatch.

Fazendo um getParameterTypes desse método, percebi q o único retorno que me vem é o do int.

Como posso solucionar esse problema ?

Grato

5 Respostas

ViniGodoy

Você deve estar obtendo a instância errada do método.

Pode colocar algum código aí? Como você obtêm a instancia do Method?

GraveDigger

Bom dia Vini, vamos lá:

metodosRS = new HashMap();
		
		Method[] metodos = ResultSet.class.getMethods();
		
		for ( int i = 0; i < metodos.length; i++ ) {
			metodosRS.put(metodos[i].getName().toLowerCase(), metodos[i]);
		}

Estou fazendo um esquema pra poder preencher qualquer VO com os resultados de um resultSet.

Estou guardando os métodos em um HashMap.

Depois eu recupero o método do Map e tento executá-lo.

[]'s

ViniGodoy

O problema é que, no caso do método sobrecarregado, o comando getMethods() irá retornar pelo menos 2 objetos Method com o mesmo nome, mas com paramTypes diferentes.

O seu hashMap vai eliminar um desses objetos, pois a chave dele é o nome do método em letras minúsculas e esse nome irá se repetir.

Para comprovar isso, faça o seguinte teste, substitua o seu for por:

for ( int i = 0; i &lt metodos.length; i++ ) { if (metodosRS.put(metodos[i].getName().toLowerCase(), metodos[i]) != null) System.out.println(&quot;Método sobrescrito: &quot; + method[i].getName()); }

Para resolver isso, crie uma classe imutável contendo o nome do método e os seus parâmetros e use essa classe como chave do seu map (lembre-se de sobrescrever equals e hashcode corretamente). Você também terá que salvar o tipo dos parâmetros em seu resultset.

Outra alternativa (na minha opinião a melhor) seria abandonar o hashmap e usar o método getMethod(String name, Class[] paramTypes) diretamente na classe.

GraveDigger

Entendo,

Vou tentar a segunda solução mesmo, depois eu volto pra falar sobre.

Valeu

[]'s

GraveDigger

Olá,

Como prometido, voltei pra falar sobre o problema.

Valeu ViniGodoy , consegui resolver o problema da forma que vc sugeriu.

Caso alguém se interesse, posto aqui a classe toda.

Sua principal função é pegar os resultados de um ResultSet e injetar em um Bean.

Bem simplezinha, mas ajudou um bocado aqui no trabalho,hehe.

[]'s

Criado 13 de dezembro de 2006
Ultima resposta 19 de dez. de 2006
Respostas 5
Participantes 2