Criação de classe dinâmica

4 respostas
L

Olá a todos!!!

Tenho um problema que, basicamente, consiste em criar uma classe dinamicamente.
Quero pegar uma string passada pelo usuário, a qual corresponderá a um código fonte, e compilar este.

A ideia é após isso transformar minha classe em um .jar e importá-lo, também dinamicamente, para este aplicativo; o qual usufruirá do código informado pelo usuário.

Exemplo:

String codigoFonte =
“public class cipu {” +
“public static int soma (int num1, int num2) {” +
“return (num1 + num2);” +
“}” +
“}”
;

Daí meu aplicativo iria compilar esse código fonte, transformá-lo em um .jar, importá-lo para o próprio aplicativo e utilizar, a partir de então, o método “soma” da classe cipu.

Resumindo: gostaria de saber como posso compilar uma classe dinamicamente.

4 Respostas

M

Você terá de usar reflection para carregar uma classe dinamicamente:
http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html

E

luizcamposmc:
Olá a todos!!!

Tenho um problema que, basicamente, consiste em criar uma classe dinamicamente.
Quero pegar uma string passada pelo usuário, a qual corresponderá a um código fonte, e compilar este.

A ideia é após isso transformar minha classe em um .jar e importá-lo, também dinamicamente, para este aplicativo; o qual usufruirá do código informado pelo usuário.

Exemplo:

String codigoFonte =
“public class cipu {” +
“public static int soma (int num1, int num2) {” +
“return (num1 + num2);” +
“}” +
“}”
;

Daí meu aplicativo iria compilar esse código fonte, transformá-lo em um .jar, importá-lo para o próprio aplicativo e utilizar, a partir de então, o método “soma” da classe cipu.

Resumindo: gostaria de saber como posso compilar uma classe dinamicamente.

Não é reflection que se usa nesse caso (não sei que mania que o pessoal tem de chamar de “reflection” a solução de um problema que eles não conhecem).

Nesse caso, você pode usar a API do Java que chama o javac, que é :

http://docs.oracle.com/javase/6/docs/api/javax/tools/package-summary.html#package_description

E

Desculpe, Mateus, eu não vi que o problema dele é composto de 2 partes:

  1. Compilar o código (nesse caso, usar o pacote javax.tools)
  2. Carregar e executar o código compilado (nesse caso, usar o que foi indicado por você).

De fato, na parte 2 é necessário, entre outras coisas, definir um classloader e usar reflection, como você havia dito.

M

entanglement:
Desculpe, Mateus, eu não vi que o problema dele é composto de 2 partes:

  1. Compilar o código (nesse caso, usar o pacote javax.tools)
  2. Carregar e executar o código compilado (nesse caso, usar o que foi indicado por você).

De fato, na parte 2 é necessário, entre outras coisas, definir um classloader e usar reflection, como você havia dito.

Exato. Eu também havia me esquecido de citar a API para chamar o javac.
Acho que isso não é tão problemático de fazer. Eu mesmo já fiz algo parecido em C#. Onde trabalho fizemos uma prova de conceito para desenvolver um sistema que suportasse plugins e o que fizemos foi criar uma DLL com uma classe que implementava uma interface específica e na aplicação cliente conseguíamos carregar os tipos (classes) existenstes na DLL a partir do assembly. Na época foi bem fácil de fazer, acho que com Java também não deve ser tão problemático.

Criado 4 de janeiro de 2013
Ultima resposta 4 de jan. de 2013
Respostas 4
Participantes 3