Reflexao - Chamada de metodo set com int e Integer

7 respostas
F

Bom dia,
estou com um problema na chamade de um metodo set via reflaxão.
Na classe ele esta definido como “setNumItens(Integer x)”, recebendo o objeto Integer.
Quando vou fazer a chamada do metodo via reflexao ele da erro pq no getMethod eu passo o class do int(Integer.TYPE). Para tentei tratar esse tipo de erro, eu passo o class do proprio Integer, so que ele continua printando a mesma excessao.

java.lang.NoSuchMethodException: Legislacao.setNumItens(int)

at java.lang.Class.getMethod(Class.java:1605)

at util.EditArtefato.callSet(EditArtefato.java:156)

at util.EditArtefato.saveMethods(EditArtefato.java:118)

at util.EditArtefato.main(EditArtefato.java:213)

Segue o codigo:

Method method = null;
	
		try{
			method = tObj2.getClass().getMethod("set"+name, editItem.getClazz());
		}catch (NoSuchMethodException e) {
			if(editItem.getValue() instanceof Integer){
				method = tObj2.getClass().getMethod("set"+name, Integer.class);
			}else if(editItem.getValue() instanceof Float){
				method = tObj2.getClass().getMethod("set"+name, Float.class);
			}else if(editItem.getValue() instanceof Long){
				method = tObj2.getClass().getMethod("set"+name, Long.class);
			}
			throw e;
		}
		if(method != null){
			method.setAccessible(true);
			method.invoke(tObj2, editItem.getValue());
		}

Alguem sabe uma solução que nao seja alterar o set pra receber um int??
Obs: essa chamada funciona normal se o metodo receber um int.

7 Respostas

M

Não entendi sua duvida.

Poste a classe de modelo que voce quer pegar o método.

E

int.class - é a “classe” do tipo primitivo int.
Integer.class - é a classe do tipo objeto java.lang.Integer.

Satisfeito?

F

Não entendi sua duvida.

Poste a classe de modelo que voce quer pegar o método.


Esse eh o metodo que estou querendo invocar:

public void setNumItens(Integer value) {
    this.numItens = value;
}

entanglement:
int.class - é a “classe” do tipo primitivo int.
Integer.class - é a classe do tipo objeto java.lang.Integer.

Satisfeito?


Isso eu sei.
O que estou querendo saber eh pq mesmo passando o “Integer.class” no getMethod ele continua dizendo que o metodo nao existe? Sendo que o method existe.

W

Posso estar viajando, mas esta linha aqui :

“java.lang.NoSuchMethodException: Legislacao.setNumItens(int)

Está afirmando, que você está passando int.class como parameter type, quando seu método tem como parameter type um Integer.

M

Integer.TYPE retorna o class do tipo primitivo int
Integer.class retorna o class de Integer

A

Como, no meio de tanta confusão, não está bem claro o que você quer, segue exemplo de invocação de método com integer:

public class Main2 {

	public static void main(String[] args) throws Exception{
		Method m = Main2.class.getMethod("eco", Integer.class);
		
		Main2 instance = new Main2();
		
		Object resultado = m.invoke(instance, new Integer("2"));
		System.out.println(resultado);

	}
	
	
	public int eco (Integer parametro) {
		return parametro;
	}

}

Note que o método eco recebe um Integer, devolve como int, que depois é transformado em Object (na saída do invoke()) e, mesmo assim, tudo ocorre bem. O que eu acho mais provável que tenha acontecido é que você tenha errado algum parâmetro do método..

[]´s

F

asaudate:
O que eu acho mais provável que tenha acontecido é que você tenha errado algum parâmetro do método…

Resolvido o problema, foi erro na minha codificação.
Antes eu estava lançando a exceçao dentro do catch independe das invocações dentro dos ifs e elses que estavam dentro do catch, por isso que estava sempre lançando exceção.
Por isso que estava sempre printando o:
“java.lang.NoSuchMethodException: Legislacao.setNumItens(int)
Foi mal ae.

Eu sei disso, so q se vc olhar no catch do codigo que eu postei, eu estava invocando o mesmo metodo passando Integer.class(dentro do catch),

try{
	method = tObj2.getClass().getMethod("set"+name, editItem.getClazz());//Esse "editItem.getClazz()" passa o Integer.TYPE
}catch (NoSuchMethodException e) {
	if(editItem.getValue() instanceof Integer){//O "editItem.getValue()" eh o atributo que eu vou passar como parametro no set
		method = tObj2.getClass().getMethod("set"+name, Integer.class);//Chamando o mesmo metodo passando Integer.class
        }

e ainda sim tava dando exceção(so que era erro na minha logica).
Vlw pelas ajudas.

Criado 11 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 7
Participantes 5