2008-10-13 13 views

Respuesta

14

Sí, es posible, pero solo desde Java 6. Peter von der Ahé se habla de los dos JSR en this interview. De JSR 199:

La API de compilador JSR 199 consta de tres cosas: la primera básicamente le permite invocar un compilador a través de la API. En segundo lugar, la API le permite personalizar la forma en que el compilador encuentra y escribe los archivos. Me refiero a los archivos en el sentido abstracto, ya que los archivos con los que trata el compilador no están necesariamente en el sistema de archivos. La abstracción de archivos de JSR 199 le permite tener archivos en una base de datos y generar resultados directamente en la memoria, por ejemplo. Finalmente, la API JSR 199 le permite recopilar diagnósticos del compilador de una manera estructurada para que pueda transformar fácilmente los mensajes de error, por ejemplo, en líneas en un editor IDE.

JSR 269 es la API de procesamiento de anotaciones.

This article ofrece una excelente visión general del acceso al Compiler Tree API. La sección "Accessing the Abstract Syntax Tree: The Compiler Tree API" parece particularmente adecuada para su pregunta.

Dependiendo de lo que esté haciendo, es posible que desee consultar el Jackpot Rule Language, que es un motor de refactorización independiente que se complementa con el Árbol del compilador.

6

Compila y ejecuta esto con -cp tools.jar (donde tienes que especificar la ubicación de tu tools.jar, obviamente).

import com.sun.source.util.Trees; 
import javax.tools.JavaCompiler; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 

public class JCTreeTest { 
    private static final JavaCompiler javac 
      = ToolProvider.getSystemJavaCompiler(); 

    public static void main(String[] args) { 
     final StandardJavaFileManager jfm 
       = javac.getStandardFileManager(null, null, null); 
     final JavaCompiler.CompilationTask task 
       = javac.getTask(null, jfm, null, null, null, 
        jfm.getJavaFileObjects(args)); 
     final Trees trees = Trees.instance(task); 
     // Do stuff with "trees" 
    } 
} 

Se compila y ejecuta para mí, aunque no he jugado con los árboles cosas yo, por lo que tendrá que read the javadoc mismo. :-) ¡Buena suerte!