Tem como executar uma classe compilada em tempo de execução sem fechar e abrir a aplicação?

5 respostas
G

Senhores, tenho uma aplicação que gera em tempo de execução arquivos .java.
Após a criação da classe utilizei o metodo com.sun.tools.javac.Main.compile() para compilar a classe criada.
Gostaria de saber se tem como eu executar esta classe sem precisar fechar a aplicação.

5 Respostas

ViniGodoy

Sim. Use um URLClassLoader para carrega-la e reflexão para criar instâncias dessa classe.

Geralmente, para fazer isso, é conveniente que essa classe implemente alguma interface, para que vc possa fazer cast depois e trabalhar sem usar reflexão o tempo todo.

G

Vou testar. Obrigado

G

Não consegui usar o URLClassLoader.

public class MyClassLoader extends ClassLoader{
@Override
public Class findClass(String name) throws ClassNotFoundException {
// lança ClassNotFoundException se o download falhar:
byte[] bytes = ???;
Class c = super.defineClass(name, bytes, 0, bytes.length);
// Você pode fazer log, definir propriedades específicas de pacotes, etc;
return c;
}
}
<\code>

Marky.Vasconcelos

Extenda URLClassLoader e não ClassLoader.

G

Senhores, desculpem a minha ignorância e falta de tempo pra responder rapidamente, mas continuo sem conseguir usar o urlClassLoader

testaTelaRelatorio("file://" + jTextFieldLocal.getText());
String nomeClasse = jTextFieldNomeClasseTelaRel.getText().trim();                
        URL endereco = null;
        URL[] allEnderecos = new URL[1];
        allEnderecos[0] = endereco;
        URLClassLoader cl =null;
        try{
            endereco = new URL(url);
            cl = new URLClassLoader(allEnderecos);
            Class classe = cl.loadClass(pacote + "." + nomeClasse);
            Object objeto = classe.getConstructors()[0].newInstance(null,true);            
            JDialog teste = (JDialog) objeto;
            teste.setVisible(true); 
        } catch (MalformedURLException ex) {
            Logger.getLogger(DevelopmentHome.class.getName()).log(Level.SEVERE, null, ex);
        }catch (ClassNotFoundException cnfex){
            JOptionPane.showMessageDialog(null, cnfex);
        }catch (InstantiationException iex){
            JOptionPane.showMessageDialog(null, iex);
        }catch (IllegalAccessException ilegex){
            JOptionPane.showMessageDialog(null, ilegex);
        }catch (InvocationTargetException itex){
            JOptionPane.showMessageDialog(null, itex);
        }

por favor me dem uma luz.

Criado 18 de agosto de 2008
Ultima resposta 19 de ago. de 2008
Respostas 5
Participantes 3