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.
Não entendi sua duvida.
Poste a classe de modelo que voce quer pegar o método.
int.class - é a “classe” do tipo primitivo int.
Integer.class - é a classe do tipo objeto java.lang.Integer.
Satisfeito?
[quote]Não entendi sua duvida.
Poste a classe de modelo que voce quer pegar o método.[/quote]
Esse eh o metodo que estou querendo invocar:
public void setNumItens(Integer value) {
this.numItens = value;
}
[quote=entanglement]int.class - é a “classe” do tipo primitivo int.
Integer.class - é a classe do tipo objeto java.lang.Integer.
Satisfeito?
[/quote]
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.
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.
Integer.TYPE retorna o class do tipo primitivo int
Integer.class retorna o class de Integer
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:
[code]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;
}
}
[/code]
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
[quote=asaudate]O que eu acho mais provável que tenha acontecido é que você tenha errado algum parâmetro do método…
[/quote]
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.