REFLECTION - Erro ao passar argumento ao invoke: "object is not an instance of declaring class"

3 respostas
M

CLASSE A - que instancia uma classe de consulta, enviado seu objeto a ela com o seguinte método:

private void consultar() {
        conCliente cC = new conCliente();
        cC.setVisible(true);
        cC.setReflection(this);
    }

CLASSE B - Possuo uma classe, que recebe este argumento, no seguinte método:

public void setReflection(Object o) {
      ob = o;
    }

CLASSE B - classe, que devolve a este OB um objeto do tipo importer, via reflection...:

private void importar() {
    //importar
        importer imp = new importer();
        imp.setNome(JTnome.getText());
        imp.setBairro(JTbairro.getText());
        imp.setCpf(JTcpf.getText());
        imp.setTelefone(JTtelefone.getText());
      //reflection
        Class<?> c = null;
        try {
          c = Class.forName(ob.getClass().getName());
        } catch (Exception e) { sst("Erro [importar]: Falha ao carregar Reflection do objeto: "+ob); }
         Method[] m = c.getDeclaredMethods();

         int i = 0;
         while (i < m.length) {
   
           if (m[i].toString().contains("cCretrive")) {
               try {

                 m[i].invoke(imp); ////ERRO
                 i = m.length+1;
                 this.dispose();
               } catch (Exception e) { sst("Erro [importar]: Falha ao invokar método cCretrive: "+e); break; }
           }
             i++;
         }


    }

O Erro ocorre na linha demarcada com o comentário: ////ERRO, com a exceção: "object is not an instance of declaring class".

O método que estou tentando invokar, é o seguinte: CLASSE A -
public void cCretrive(consultas.importer ob) {
        String cpf = "";
        cpf = ob.getCpf();
        //traz na tela ;D
        System.out.println(cpf);
    }

3 Respostas

V

Só um comentário...

Pq você faz:
Class&lt?&gt c = null;

try {
   c = Class.forName(ob.getClass().getName());
} catch (Exception e) { sst(&quot;Erro [importar]: Falha ao carregar Reflection do objeto: &quot;+ob);
Ao invés de simplesmente
Class&lt?&gt c = obj.getClass();
?
V

Outra coisa, a assinatura do método invoke é

invoke(Object obj, Object[] args)

O primeiro parâmetro é o objeto em que o método será invocado.

Sua variável ob não é da classe Importer. É da classe de ob que o método cCretrive vem. No entanto, você está chamando o invoke em imp, que é o seu Importer.

O correto, se você quer passar o importer como parâmetro, é:

m[i].invoke(ob, imp);
M

Sensacional,
muito obrigado, funcionou perfeitamente.

Abraços

Criado 2 de maio de 2007
Ultima resposta 3 de mai. de 2007
Respostas 3
Participantes 2