Boa tarde, pessoal do GUJ!
Estou fazendo aqui, por questões de praticidade (?!), uma pequena configuração no Windows para que eu possa rodar classes com 2 cliques.
Criei um arquivo bat com o seguinte:
cd C:\Java
java RunClass %1
Então, configurei o Windows para que, quando o usuário der 2 cliques sobre o arquivo *.class, o comando acima seja chamado, passando o path do arquivo para a minha classe RunClass.
Minha classe RunClass está assim:
import java.lang.reflect.Method;
import java.io.File;
public final class RunClass
{
public static void main(String[] args)
{
String className = (new File(args[0])).getName().replace(".class", "");
(new RunClass()).runIt(className);
}
public void runIt(String className)
{
try
{
Class classPoint = Class.forName(className);
Method method = classPoint.getMethod("main", new Class[] { String[].class });
method.invoke(classPoint.newInstance(), new Object[] { new String[] { } });
}
catch(Exception e)
{ e.printStackTrace(); }
}
}
O fato de eu estar criando um objeto File e então pegando o nome é que, quando o Windows passa um nome de arquivo para uma aplicação, este nome vai formatado em formato DOS. Exemplo: C:\ARQUIV~1\FOLDER0~1\NOMEDA~1.CLASS
Para solucionar, usei o objeto File pra pegar o nome corretamente.
O Windows está passando o nome corretamente e a aplicação está chamando o método main perfeitamente. O problema (que eu não havia pensando quando tive a idéia de fazer a classe) é que o classpath não estará incluindo a pasta do arquivo *.class que estou tentando executar.
Eu li o tutorial sobre Classloader do GUJ mas não entendi muito bem como eu poderia usar nesse meu caso.
P.S.: é meio estranho que, para carregar uma classe, eu tenha de estar carregando outra primeiro, eu sei. Já pensei em fazer isso com o Runtime, mas preferi fazer assim para praticar um pouco de Reflection. Ah, também estou ciente de que essa minha classe só carregará classes que estejam no pacote-padrão.
Como eu adiciono uma pasta ao classpath em tempo de execução?