JavacTaskからjavacコンパイラコンテキストを取得する方法は?
質問
注釈処理プログラミングモデルを考慮すると、次のような注釈プロセッサ内からコンパイラコンテキストへの参照を取得する方法は十分に確立さ:
context = ((JavacProcessingEnvironment) this.processingEnv).getContext();
このコンパイラコンテキストは、次のような内部コンパイラ機能への参照が必要な場合に使用できます Attr
, Enter
, MemberEnter
, TreeMaker
, 、等。インスタンスメソッド呼び出しを介して:
make = TreeMaker.instance(context);
ただし、Java8を使用する プラグインの仕組み, 、どのように1つの参照ができますか com.sun.tools.javac.util.Context
インスタンス?ドキュメントの状態:
コンパイラ内では、呼び出しごとに単一のコンテキストが使用されます コンパイラ。コンテキストは、次の単一のコピーを確保するために使用されます 各コンパイラフェーズは、コンパイラの呼び出しごとに存在します。
したがって、プラグイン内では、JavacTaskへの参照が渡されます(実質的にBasicJavacTask)が、現在のコンパイラフェーズのcontextオブジェクトをどのように取得できますか?
解決
呼び出し getContext()
で動作しません Java8コンパイラープラグイン メカニズム:
((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の一部ではありません。これに依存するコードを記述する場合は、ご自身の責任で行ってください。このコードおよびその内部インターフェイスは、予告なしに変更または削除される場合があります。