Pregunta

Considerando el modelo de programación de procesamiento de anotaciones, está bien establecido cómo obtener una referencia al contexto del compilador desde un procesador de anotaciones con algo como esto:

context = ((JavacProcessingEnvironment) this.processingEnv).getContext();

Este contexto del compilador se puede utilizar cuando se necesita una referencia a una instalación interna del compilador como Attr, Enter, MemberEnter, TreeMaker, etc.a través de una llamada a un método de instancia:

make = TreeMaker.instance(context);

Sin embargo, usando Java 8 mecanismo de complemento, ¿cómo se puede hacer referencia com.sun.tools.javac.util.Context ¿instancias?La documentación dice:

Dentro del compilador, se utiliza un solo contexto para cada invocación del compilador.El contexto se utiliza para garantizar que exista una copia única de cada fase del compilador por invocación del compilador.

entonces, dentro de un complemento, mientras se pasa una referencia a JavacTask (efectivamente, BasicJavacTask), ¿cómo se puede recuperar el objeto de contexto de la fase actual del compilador?

¿Fue útil?

Solución

Vocación getContext() no funcionará con el Complemento del compilador Java 8 mecanismo:

((JavacTaskImpl) task).getContext()

Por ejemplo:

import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.main.JavaCompiler;
// ...

JavacTask javacTask = getJavacTask();
Context context = ((JavacTaskImpl)javacTask).getContext();
JavaCompiler compiler = JavaCompiler.instance( context );

Tenga en cuenta, sin embargo, que com.sun.tools.javac.main.JavaCompiler no implementa el javax.tools.JavaCompiler interfaz y, por lo tanto, su API no está disponible utilizando esta técnica.Además, preste atención a la advertencia para JavacTaskImpl y com.sun.tools.javac.main.JavaCompiler:

Esto NO es parte de ninguna API compatible.Si escribe código que depende de esto, lo hace bajo su propio riesgo.Este código y sus interfaces internas están sujetos a cambios o eliminación sin previo aviso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top