Boa tarde pessoal,
Seguinte, tenho um programa que compila um arquivo java editado por mim e gera um .class caso esteja tudo certo. Eu preciso usar um método que está nesse .class e executa-lo durante a execução desse meu programa ja falado. Teria como eu fazer isso?
Exemplo: tenho um jogo onde um aluno preenche dentro de um arquivo .java pre-escrito como o metodo executa() vai funcionar. Então o meu jogo vai compilar esse codigo e após isso vai tentar usar esse método durante uma determinada hora.
Aguardo respostas!
Uso de .class compilado dinamicamente
4 Respostas
Procure sobre ClassLoaders.
Se você obrigar a classe compilada a implementar uma interface você pode chamar os métodos pelo nome na interface, caso contrario apenas através de Reflection.
Procure sobre ClassLoaders.Se você obrigar a classe compilada a implementar uma interface você pode chamar os métodos pelo nome na interface, caso contrario apenas através de Reflection.
Então, esse class compilada tem só um metodo que eu quero executa-lo depois de compilar. Teria algum exemplo para me ajudar?
Bom, isso depende se a sua classe fica no pacote certinho.
Algo assim:
package br.com.meujogo;
Seu .class tem que estar assim: br/com/meujogo/MinhaClasse.class.
Se isso estiver ok, você pode fazer isso:
try {
Class<?> c = Class.forName("br.com.meujogo.MinhaClasse");
Object minhaInstancia = c.newInstance();
Method method = c.getMethod("meuMetodo", String.class);
Object retorno = method.invoke(minhaInstancia, "argumento");
} catch (ClassNotFoundException e) {
throw new RuntimeException("Class not found.", e);
} catch (InstantiationException e) {
throw new RuntimeException("Unable to instantiate this class.", e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException("This method signature does not exists.", e);
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
Agora, para você não precisar ficar se preocupando com esse monte de catches, você poderia usar o Mirror project, que torna isso mais simples:
Object minhaInstancia = new Mirror().on("br.com.meujogo.MinhaClasse").invoke().constructor().withoutArgs();
Object retorno = new Mirror().on(minhaInstancia).invoke().method("meuMetodo").withArgs("argumento");
Mas por exemplo, quando eu rodo minha aplicação, eu rodo a partir de um jar gerado pelo NetBeans, dentro dele contém apenas .class la. No meu caso eu quero gerar um novo .class e buscar por ele, se eu buscar pelo nome do pacote daria certo mesmo ele estando fora do .jar?