Eu estou trabalhando com um código que gera classes baseadas em uma tabela do banco, Ex.:
...
setClassConfig("net.projeto.dominio.Alguem", "TABELA_ALGUEM");
...
Eu gero essa classe “Alguem” no caminho especificado: “net/projeto/dominio” e bla bla bla…
O problema é que depois de executar esse código eu preciso “carregar” essa classe com um Class.forName()… porém ao referenciar a classe ocorre um erro dizendo que a mesma não foi encontrada…
Eu preciso compilar essa classe em runtime? O que mais eu preciso fazer para sincronizar o programa para que ele reconheça a existência dessa classe gerada em tempo de execução?
Agradeço antecipadamente…
Bom, eu estou usando a classe “JavaCompiler”, porém ela gera o arquivo no mesmo diretório do arquivo fonte. O problema é que o projeto está configurado para armazenar os arquivos compilados na pasta bin. Portanto, ao dar um Class.forName(“pacote.pacote.Classe”) ocorre um erro de classe não encontrada…
Tem como eu direcionar a saída desse JavaCompiler para o diretório de output das classes compiladas?
Bom, consegui resolver meu problema.
Aqui o código de exemplo:
package diversos;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
public class TesteClassLoadewr {
public static void main(String args[]) throws IOException, ClassNotFoundException {
String binPath = "bin";
String classeJava =
"package dominio.entidades;\n\n" +
"public class Usuario {\n\n" +
"\tpublic String email;\n" +
"\tpublic String senha;\n\n" + "}";
File arquivo = new File("src/dominio/entidades/Usuario.java");
if (!arquivo.exists()) {
arquivo.createNewFile();
}
FileOutputStream fos = new FileOutputStream(arquivo);
fos.write(classeJava.getBytes());
fos.flush();
fos.close();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavaFileManager = compiler.getStandardFileManager(null, null, null);
standardJavaFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(binPath)));
CompilationTask compilationTask = compiler.getTask(null, standardJavaFileManager, null, null, null, standardJavaFileManager.getJavaFileObjectsFromFiles(Arrays.asList(arquivo)));
compilationTask.call();
Class clazz = Class.forName("dominio.entidades.Usuario");
System.out.println(clazz);
}
}