Duvida exec() (resolvido)

e ae pessoal, blz? gostaria de desenvolver um codigo que leia um arquivo texto (.txt) e copie este para um arquivo (.java) alterando somente uma linha, graças ao forum tive sucesso com a manipulação dos arquivos, so que o proposito em questão é que o usuario entre com a linha a ser atualizada, que o programa atualize o (.java) e use o em seguida, vou exemplificar:[size=18] [/size]

[color=red]ARQUIVO (HelloWorldApp.txt) :[/color]

class HelloWorldApp {
static String Imprime = " JAVA ";
public static void CPY(){
System.out.println(“Hello World!”);
}
public static void main(String[] args) {
CPY();
}
}

[color=red]ARQUIVO (HelloWorldApp.java) - antes - :[/color]

class HelloWorldApp {
static String Imprime = " JAVA ";
public static void CPY(){
System.out.println(“Hello World!”); // linha que sera alterada
}
public static void main(String[] args) {
CPY();
}
}

[color=red]ARQUIVO (HelloWorldApp.java) - depois de executado o codigo - :[/color]

class HelloWorldApp {
static String Imprime = " JAVA ";
public static void CPY(){
System.out.println( Imprime ); // linha alterada
}
public static void main(String[] args) {
CPY();
}
}

e finalizando:

public static void main(String[] args) throws IOException {

            new ArqText(); // metodo que copia HelloWorldApp.txt para HelloWorldApp.java
            Runtime r= Runtime.getRuntime();
         r.exec("javac HelloWorldApp.java");
         new HelloWorldApp().CPY();

}

na saida de execução tem-se:

       [b]Hello World![/b]

porem o objetivo era a saida:

            [b]JAVA[/b]

se alguem poder me ajudar, desde ja agradeço, vlw

A classe HelloWorldApp é compilada juntamente com as restantes e é carregada para memória quando executas o programa. Ao chamar o exec para compilar novamente, não vai substituir a classe compilada que se encontra em memória.

Para o que queres fazer tens de usar reflection, algo mais ou menos assim:

Runtime r= Runtime.getRuntime();
Process p = r.exec("javac HelloWorldApp.java");
p.waitFor(); // Espera que a compilação termine
Class clazz = Class.forName("HelloWorldApp"); // Procura a class por nome
Method method = clazz.getMethod("CPY"); // Procura o método por nome
Object myObj = clazz.newInstance();  //Cria uma instância da class HelloWorldApp
method.invoke(myObj); // Invoca o método sobre a instância criado.

A parte de criação da instância não era necessária neste caso concreto porque o método é static, de qualquer forma fica a explicação completa :slight_smile:

vlw, deu certo! :smiley: