Executar classe em runtime com tools.jar

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+

Eu custumo fazer assim:

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…

Entendeu?

Qualquer dúvida diz… :wink:

Blz, mas só uma duvida

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.

Obrigado pela ajuda!!!

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;

public class Teste {

}
[/i]
entendeu?

Aqui pra mim no pacote java.lang.reflect nao existe as classes ClassLoader e URLClassLoader.
É necessário instalar alguma API?
Obrigado t+

Cleiton,

O que está em java.lang é default e já vem junto a JDK

Verifique se vc está digitando corretamente

[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…

java.net.URLClassLoader

java.lang.ClassLoader ou só ClassLoader :stuck_out_tongue:

:wink:

eduveks blz?

num to conseguindo, agora ele diz que o tipo é incompativel (é String e tinha que ser java.net.URL), a linha de comando que montei é a seguinte

java.lang.ClassLoader abrir = new java.net.URLClassLoader(new java.net.URL[] {"C:/Documents and Settings/cleiton/Meus documentos/"});

teim algum jeito de converter? tah errado essa linha?
cara, que coisinha mais chatinha, faz 2 dias que to em cima disso i nada. rsrs

vlw t+

[quote=cleiton herrmann]eduveks blz?

num to conseguindo, agora ele diz que o tipo é incompativel (é String e tinha que ser java.net.URL), a linha de comando que montei é a seguinte

java.lang.ClassLoader abrir = new java.net.URLClassLoader(new java.net.URL[] {"C:/Documents and Settings/cleiton/Meus documentos/"});

teim algum jeito de converter? tah errado essa linha?
cara, que coisinha mais chatinha, faz 2 dias que to em cima disso i nada. rsrs

vlw t+[/quote]

Caraius… hoje to durmindo… desculpa ai meu… to fazendo tudo de cabeça e a cabeça já não tá funcionando direito :smiley:

java.lang.ClassLoader abrir = new java.net.URLClassLoader(new java.net.URL[] {new File("C:/Documents and Settings/cleiton/Meus documentos/").toURL()});

Abora vai :stuck_out_tongue:

rsrssrs, nem esquenta !!!
heim, mais uma coisinha

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());
        }

obrigado t+

Meu… o q te ajudei a fazer é conseguir o objecto Class… a referencia da Classe… agora tem que trabalhar com ela…

Por exemplo para vc invocar um método da class é assim:

Class classe = abrir.loadClass("Main");
Object objectParameters[] = { "teste" };
Class classParameters[] = { objectParameters[0].getClass() };
Method theMethod = classe.getDeclaredMethod("NOME_DO_METODO", classParameters);
theMethod.invoke(null, objectParameters);

Este código vai chamar o método da clase Main…

public void NOME_DO_METODO(String str) {
     ...
}

Ai agora vasta verificar os métodos q vc tem na variavel classe…

Por exemplo se quiser a listagem de todos os métodos q a classe tem basta:

classe.getMethods()

E pega um array com os métodos…

Dá uma lida nisto…

http://www.guj.com.br/java.tutorial.artigo.10.1.guj

Blz blz, consegui fazer o que eu queria… :smiley:

Muito obrigado pela ajuda eduveks, e desculpa qualquer coisa ai…

Ótimo :wink:

E desculpa ai minhas trapalhadas é q não ando com muito tempo e tentei ser rápido e acabei por não ser claro :lol: