Olá
O Java 6 virá com a nova JSR-199 com as seguintes utilidades:
- API para invocar o compilador
- API para obter diagnósticos em forma estruturada
- plugin API para permitir compilação para a memória ou compilação a partir do que está armazenado na memória em uma String e também de outras locações
Em pseudo código um exemplo poderia ser assim:
Reader rdr =new StringReader("class Foo { int max(int i, int j) { if (...) ... } }");
javac.compile(rdr);
Porém não haverá classe javac e tudo foi feito de modo mais genérico. A receita de bolo será a seguinte:
-
Criar um objeto [color=darkblue]JavaCompiler[/color] de um [color=darkblue]ToolProvider[/color]
-
Criar um [color=darkblue]StandardFileManager[/color], que é um gerenciador de Files baseado em java.io.File, correspondente ao objeto anterior
-
Com o objeto da interface [color=darkblue]StandardFileManager[/color], criar um Iterable que extende [color=darkblue]JavaFileObject[/color] contendo uma ou mais unidades à compilar (*)
-
Usar o método [color=darkblue]getTask()[/color] (**) do objeto criado em 1. com a interface [color= darkblue]JavaCompiler[/color] para retornar um [color= darkblue]JavaCompiler.CompilationTask[/color] para o qual se chama o método [color=darkblue]call()[/color] que finalmente compila todas as unidades que queremos compilar
(*) “arquivos” fonte.
(**) [color=darkblue]getTask(Writer, JavaFileManager, DiagnosticListener<? super JavaFileObject>, Iterable<String>, Iterable<String>, Iterable<? extends JavaFileObject> )[/color]
Da JSR tirei o seguinte trecho de código:
Files[] files1 = ... ; // input for first compilation task
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null);
Iterable<? extends JavaFileObject> compilationUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
compiler.getTask(null, fileManager, null, null, null,
compilationUnits1).call();
fileManager.close();
Na verdade o conjunto de instruções que está na JSR-199 pega 2 grupos de arquivos e compila os 2 reusando o mesmo StandardFileManager para o cache dos arquivos jar.
É possível pegar também os diagnósticos da compilação, logar tudo que está fazendo e compilar um arquivo guardado em uma String extendendo SimpleJavaFileObject. Tudo isto tem exemplo no javadoc da interface JavaCompiler
Tá bom ou querem mais? :lol:
[]s
Luca

