Как получить контекст компилятора Javac от Javactask?
Вопрос
Учитывая модель программирования обработки аннотации, хорошо известна, как получить ссылку на контекст компилятора из процессора аннотации с чем-то вроде этого:
context = ((JavacProcessingEnvironment) this.processingEnv).getContext();
.
Этот контекст компилятора может быть использован при необходимости для ссылки для внутреннего компилятора, такого как Attr
, Enter
, MemberEnter
, TreeMaker
и т. Д. Через экземпляр вызов:
make = TreeMaker.instance(context);
.
Однако, используя Java 8 механизм плагина , как Может ли один эталон экземпляров com.sun.tools.javac.util.Context
? Документация состояния:
внутри компилятора один контекст используется для каждого вызова компилятор. Контекст затем используется для обеспечения одной копии Каждая фаза компилятора существует на вызов компилятора.
Так как в платене пропускается ссылка на Javactask (эффективно Basicjavactask), как можно получить объект контекста текущей фазы компилятора?
Решение
Calling getContext()
Не будет работать с Java 8 Плагин компилятора Механизм:
((JavacTaskImpl) task).getContext()
.
Например:
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 );
.
Примечание, однако, что com.sun.tools.javac.main.JavaCompiler
не реализует Следовательно, javax.tools.JavaCompiler
и его API недоступны, используя эту технику. Кроме того, прислушиваясь к предупреждению для JavacTaskImpl
и com.sun.tools.javac.main.JavaCompiler
:
Это не является частью любого поддерживаемого API. Если вы пишете код, который зависит от этого, вы делаете это на свой собственный риск. Этот код и его внутренние интерфейсы могут быть изменены или удалением без предварительного уведомления.