Olá pessoal, td bom?
Eu tenho um programinha que gera a partir de informações fornecidas pelo usuario, em um jTextArea um texto, na verdade uma classe java, então esse texto é gravado em disco, ou seja, é criado um arquivo.java, logo em seguida, esse arquivo é compilado, surge então um arquivo.class, o que eu quero é executar esse arquivo.class a partir do meu sisteminha, ou seja, o usuário fornece as informações para criação da classe java, o arquivo.java é gerado e compilado e então surge o arquivo.class, só ta faltando rodar esse arquivo.class.
Mas estou tendo problemas, o erro é que nao acha a classe.
O código que estou usando é o seguinte:
private void executar() {
try {
Object parametrosObjeto[] = {new String[]{}}; //parametros do metodo
Class parametrosClasse[] = {parametrosObjeto[0].getClass()}; //classe dos parametros
Class classe = Class.forName(caminhoCriacao + "Main.class"); //referencia a classe
Object instancia = classe.newInstance(); //instancia a classe
Method metodoMain = classe.getDeclaredMethod("main", parametrosClasse);
metodoMain.invoke(instancia, parametrosObjeto); //executa o metodo
} catch (Exception e) {
jtaSaida.append(e.toString());
}
}
onde a variável caminhoCriacao é uma String representativa do diretório onde foi gerado o arquivo.class, Main.class é o nome do arquivo e jtaSaida é um jTextArea onde é exibido o erro, que no caso é “ClassNotFoundException: C:\Documents and Settings\cleiton\Meus documentos\Main.class”.
Na linha Class classe = Class.forName(…), eu ja tentei passar somente Main, Main.class, o diretório + Main, o diretório + Main.class, nao tem jeito, nao consigo rodar a classe.
Se alguem puder me ajudar…
Desde já grato… t+
String file = "org/teste/Teste1";
ClassLoader loader = new java.net.URLClassLoader(new java.net.URL[] { new File("c:/app/bin").toURL() });
Class _class = loader.loadClass(file.replace('/', '.'));
Isto funciona bem, tem q no loadClass passar apenas o caminho da classe mas no formato do java e não o caminho fisico…
E o URLClassLoader coloca o caminho fisico da pasta onde esta a estrutura dos packages java, pode ser mais que uma pasta, quantas for preciso, é um array… que o URLClassLoader vai automaticamente carregar todos arquivos .class para a virtual machine… ai depois com o loadClass é só chamar a class via string no formato do java…
Na primeira linha do código de exemplo que vc colocou, eu passo o diretório onde foi gerada a minha classe no formato do java, mas esse formato do java, como seria ele? seria algo como: C:\diretorio\diretorio\arquivo.class ou não?
no URLClassLoader, no lugar do “bin” que vc colocou no código de exemplo, eu tenho que colocar o caminho do diretório \bin que ta dentro do diretório de instalação do java? é isso?
e por fim, hehehe, eu nao consigo fazer os imports necessários, pois não existe aqui pra mim dentro do pacote reflect as classes ClassLoader e URLClassLoader, que vc usa na segunda linha, é necessário instalar alguma API?
se vc puder colocar um exemplo com um suposto diretório e arquivo ficaria melhor eu acho.
ClassLoader loader = new java.net.URLClassLoader(new java.net.URL[] { new File("c:/app/bin").toURL() });
Class _class = loader.loadClass("org.teste.Teste");
acho q assim dá para entender melhor né?
a class org.teste.Teste vai estar em: c:/app/bin/org/teste/Teste.class
este é o caminho real…
e o package da classe Teste vai ser:
[i]
package org.teste;
[quote=cleiton herrmann]Aqui pra mim no pacote java.lang.reflect nao existe as classes ClassLoader e URLClassLoader.
É necessário instalar alguma API?
Obrigado t+[/quote]
Peço desculpa… fiz o código de cabeça e não confirmei os packages…
eu debuguei o projeto e na hora de execução da segunda linha do try/catch, ele parece que nao instancia neim abre a classe, simplesmente nao acontece nada, neim erro nao da. será que está faltando algo?
try {
java.lang.ClassLoader abrir = new java.net.URLClassLoader(new java.net.URL[] {new File(caminhoCriacao).toURL()});
Class classe = abrir.loadClass("Main");
} catch (MalformedURLException ex) {
jtaSaida.append(ex.toString());
} catch (ClassNotFoundException ex) {
jtaSaida.append(ex.toString());
}