Uso de .class compilado dinamicamente

4 respostas
P

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!

4 Respostas

Marky.Vasconcelos

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.

P

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?

Rafael_Guerreiro

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");
P

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?

Criado 20 de julho de 2015
Ultima resposta 20 de jul. de 2015
Respostas 4
Participantes 3