Como obter o compilador javac Contexto de um JavacTask?
Pergunta
Considerando a anotação de processamento de modelo de programação, está bem estabelecido como obter uma referência para o compilador contexto de dentro de um processador de anotação com algo como isto:
context = ((JavacProcessingEnvironment) this.processingEnv).getContext();
Este compilador de contexto pode ser utilizado quando uma referência é necessária para um compilador interno facilidade como Attr
, Enter
, MemberEnter
, TreeMaker
, etc.através de um método de instância chamada:
make = TreeMaker.instance(context);
No entanto, usando o Java 8 plugin mecanismo de, como referência com.sun.tools.javac.util.Context
instâncias?A documentação declara:
Dentro do compilador, um único Contexto é usado para cada invocação de o compilador.O contexto é, então, usado para garantir que uma única cópia de cada compilador fase existe por compilador de invocação.
assim, dentro de um plugin, enquanto uma referência para o JavacTask é passado (efetivamente BasicJavacTask), como pode o objeto de contexto do atual compilador fase de ser recuperada?
Solução
Chamar getContext()
não irá funcionar com o Java 8 compiler plugin mecanismo:
((JavacTaskImpl) task).getContext()
Por exemplo:
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 );
Note, no entanto, que com.sun.tools.javac.main.JavaCompiler
não implementar o javax.tools.JavaCompiler
interface e sua API é, portanto, indisponível a utilizar esta técnica.Além disso, ouvidos o aviso para JavacTaskImpl
e com.sun.tools.javac.main.JavaCompiler
:
Este NÃO é parte de nenhuma API suportada.Se você escrever código que depende, você o faz por sua própria conta e risco.Este código e suas interfaces internas estão sujeitos a alterações ou cancelamento sem aviso prévio.