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.
Tem como executar uma classe compilada em tempo de execução sem fechar e abrir a aplicação?
5 Respostas
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.
Vou testar. Obrigado
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>
Extenda URLClassLoader e não ClassLoader.
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.