Instanciar uma classe em tempo de execucao.[RESOLVIDO]

12 respostas
G

ola a todos…

estou precisando instanciar uma classe em tempo de execucao, mas nao esta dando certo (esta passando por uma excecao), com as dicas dos topicos q estou vendo. estou fazendo assim:

public void ExecFuncMnu() throws SQLException {
        // cPackageFuncao = "SystCom.MntCadFor.java"
        String cClasse = cPackageFuncao.replace(".java","");

        JOptionPane.showMessageDialog(null, cPackageFuncao+" <=> "+cClasse );

        try {
            try {
                Object obj = Class.forName(cClasse).newInstance();
                try {
                    Method m1 = obj.getClass().getMethod(cClasse, new Class[0]);
                } catch (NoSuchMethodException ex) {
                    //Logger.getLogger(SystMnu.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, "ok_1" ); // sempre esta passando aki.
                } catch (SecurityException ex) {
                    //Logger.getLogger(SystMnu.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, "ok_2" );
                }
                //Object ret1 = m1.invoke (obj1, new Object [0]);


                JOptionPane.showMessageDialog(null, "ok" );
            } catch (InstantiationException ex) {
                //Logger.getLogger(SystMnu.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "problema 1" );
            } catch (IllegalAccessException ex) {
                //Logger.getLogger(SystMnu.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "problema 2" );
            }
        } catch (ClassNotFoundException ex) {
            //Logger.getLogger(SystMnu.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "problema 3" );
        }

se algum puder ajudar no q estou fazendo errado, fico agradecido: MUITO OBRIGADO !!!

12 Respostas

Felagund

ao invez de getMethod
use getDeclaredMethod

:slight_smile:

G

ola…

obrigado por responder…

fiz a sua sugestao, mas a execucao ainda continhua passando na mesma excecao q estava fazendo antes (no exemplo postado acima)…

mais alguma dica ? hehehe

obrigado !!!

G

nesse caso, nao dah pra usar uma macro de substituicao ?

tipo, a chama seria assim:

SystCom.MntCadFor oMntCadFor = new SystCom.MntCadFor();
oMntCadFor.MntCadFor();

nao existe uma forma, utilizando macro de substituicao, que ficaria mais ou menos assim,

( "SystCom.MntCadFor") o("MntCadFor" ) = new ( "SystCom.MntCadFor")() );
o("MntCadFor").( "MntCadFor")() );

soh desculpem a criativida em “inventar” essa sintaxe…rss

mas, se me fiz entender, esta falando…rs

obrigado !

Mikhas

Da sim, se chama Reflections e existe uma biblioteca legal para mexer com isso chamada Mirror.
Tem alguns topicos sobre o Mirror no forum. Da uma buscada

P

Você poderia informar qual é o erro?

G

nao eh q dah erro, mas entra na condicao de excecao (algo aconteceu q nao executou):

JOptionPane.showMessageDialog(null, "ok_1" ); // sempre esta passando aki.

nessa linha q passa (o codigo esta postado na primeira mensagem.

e esse Mirror ? teria como postar um codigo pra exemplificar melhor à minha necessidade ?

obrigado !!!

P

NoSuchMethodException é lançada quando o método não é encontrado!

Perceba que você está querendo obter um método com o mesmo nome da classe!!!

Object obj = Class.forName(cClasse).newInstance();

Method m1 = obj.getClass().getMethod(cClasse, new Class[0]);

Vou te passar um exemplo de como você deve fazer:

String className = "com.NomeDaClasse";
String metodo = "nomeDoMetodo";

//obtém a classe
Class<?> objClass = Class.forName( className );
//cria uma instância da classe
Object obj = objClass.newInstance();
//obtém o método
Method m = objClass.getDeclaredMethod( metodo, new Class[]{} );
//libera o acesso ao método caso seja privado
m.setAccessible( true );
//chama o método
m.invoke( obj );
B

Dê uma olhada na API, ele diz que o primeiro parâmetro é o nome do método… Se você modificar esta String cClass por um nome de método válido você vai conseguir obter o método…

Se você quiser pegar todos os métodos da classe, você pode fazer algo do tipo:

Method[] methods = obj.getClass().getMethods();
for(Method m : methods) {
   System.out.println(m);
}
G

exatamente ! na verdade eu ainda nao tenho decidido, mas poderei opcao entre 2, uma opcao:

  1. executar um metodo com o mesmo nome da classe;
  2. executar o construtor;

poderia, por favor, ajudar, nas duas situacoes ?

obrigado !!!

B

Para executar um método com o mesmo nome da classe basta fazer:

Method m = objClass.getDeclaredMethod( objClass.getSimpleName(), new Class[]{} );

O construtor você já executa no newInstance :wink:

P

não é aconselhável você querer usar a mesma variável para o nome da classe e o nome do método, porque o nome da classe deve ser informada junto com o seu pacote (ex: com.br.NomeDaClasse).
Para instanciar usando um construtor especifico faça o seguinte:

//obter o construtor sem parâmetros 
Constructor con = objClass.getConstructor( new Class[]{} ); 
//Criar uma nova instância 
Object obj = con.newInstance( new Class[]{} );
G

agradeco a todos a ajudaram…

esta funcionando !

MUITO OBRIGADO !!!

Criado 17 de agosto de 2009
Ultima resposta 17 de ago. de 2009
Respostas 12
Participantes 5