2014-02-24 42 views
1

考慮註釋處理的編程模型,它是公認的如何從註釋處理器內獲得具有像這樣的編譯器上下文的引用:如何從JavacTask獲取javac編譯器上下文?

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

需要一個參考時,此編譯器上下文,可以使用通過實例的方法調用的內部編譯器的設施等AttrEnterMemberEnterTreeMaker等:

make = TreeMaker.instance(context); 

然而,使用Java 8 plugin mechanism,如何可以參考com.sun.tools.javac.util.Context實例嗎?該文檔指出:

在編譯器中,編譯器每次調用 時使用一個上下文。然後使用上下文來確保每個編譯器調用存在每個編譯器階段的單個副本 。

因此在一個插件中,而對JavacTask的引用被傳遞(實際上是BasicJavacTask),那麼當前編譯器階段的上下文對象如何被檢索?

回答

3

調用getContext()不會與Java 8 compiler plugin機制工作:

((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也因此不可用使用這種技術。此外,聽從警告的JavacTaskImplcom.sun.tools.javac.main.JavaCompiler

這不是任何支持的API的一部分。如果您編寫依賴於此的代碼,則需要您自擔風險。此代碼及其內部接口如有更改或刪除,恕不另行通知。

+0

是否有任何情況下JavacTaskImpl可能已被翻譯爲com.sun.tools.javac.api.BasicJavacTask?我相信這是由於它們之間的相似性。 –