如何从 JavacTask 获取 javac 编译器上下文?
题
考虑到注释处理编程模型,已经明确如何从注释处理器内获取对编译器上下文的引用,如下所示:
context = ((JavacProcessingEnvironment) this.processingEnv).getContext();
当需要引用内部编译器设施时,可以使用此编译器上下文,例如 Attr
, Enter
, MemberEnter
, TreeMaker
, , ETC。通过实例方法调用:
make = TreeMaker.instance(context);
然而,使用 Java 8 插件机制, ,如何参考 com.sun.tools.javac.util.Context
实例?文档指出:
在编译器中,用于编译器的每个调用。然后,将上下文用于确保每个编译器调用都存在每个编译器阶段的单个副本。
因此,在插件中,虽然传递了对 JavacTask 的引用(实际上是 BasicJavacTask),但如何检索当前编译器阶段的上下文对象?
解决方案
呼唤 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 的一部分。如果您编写依赖于此的代码,则需要自行承担风险。该代码及其内部接口如有更改或删除,恕不另行通知。
不隶属于 StackOverflow