2017-08-06 166 views
0
@SupportedAnnotationTypes({"com.tg.annotation.Table", "com.tg.annotation.Test"}) 
public class TgDaoGenerateProcessor extends AbstractProcessor { 
    private Messager messager; 

    @Override 
    public synchronized void init(ProcessingEnvironment processingEnv) { 
     super.init(processingEnv); 
     messager = processingEnv.getMessager(); 
    } 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
     messager.printMessage(Diagnostic.Kind.NOTE, "annotations size " + annotations.size()); 
} 

在我的項目有一個類註釋@Table和類註釋@Test關於Java AbstractProcessor的一些問題?

我乾淨的輸出目錄和在建的IntelliJ,輸出兩行:

annotations size 2 
annotations size 0 

爲什麼有兩行呢? javac做了什麼?

如果我重建它沒有打印。我想我不修改源代碼,所以javac不會生成新的.class。如果我修改了一個註解爲@Table並重建的類,則輸出爲:annotations size 1。 APT得到@Table信息,無法獲得@Test註釋類信息,因爲我不修改註釋類@Test

我想獲得帶註釋的課程信息@Table@Test並使用它們生成一個xml文件。舉一個例子:A級註釋爲@Table,B級註釋爲@Test,APT將獲得A類和B類的字段和方法,然後將它們寫入新文件。因此,如果只修改類A,更改一些字段和方法。構建和APT處理器不能獲得註釋爲@Test的類B,缺少這些信息我無法生成最新的xml文件。當然,我清理輸出目錄並重建,它會工作,但沒有人願意這樣做。所以改變任何一個班級,如何讓APT Processor可以獲得所有班級的信息。

+0

問題不明確,請參見[問]。 – EJoshuaS

+1

您應該閱讀['Processor']的文檔(http://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html)。它有更多的細節,並解釋了這種事情。 – Radiodef

回答

1

這是很難回答,當你一次問多個問題(並且這樣做是against StackOverflow policies)......讓我們用更少的相關問題,首先做掉:

爲什麼會有拖行? javac做了什麼?

這是因爲多輪處理。需要多輪處理由註釋處理器生成的類的註釋。詳情請參閱documentation of Processor

和我重建它沒有輸出

不要依賴此。您還沒有指定構建系統(IntelliJ Ant?Maven?Gradle?)。不同的構建系統以不同的方式處理增量編譯,其中一些可能會在項目使用註釋處理器時完全禁用增量構建。最值得注意的是,Android Gradle插件和最近版本的Gradle本身增量編譯來解決它與註釋處理器的兼容性不佳。

如果您需要簡單的方法,讓您的註釋處理器的用戶也禁用增量編譯。或者,您可以重新設計處理器以與增量編譯兼容。這是一項複雜的任務,如果您對此感興趣,我建議您另外提出一個問題。

我修改註釋@Table類和重建,輸出標註尺寸1

不要使用process第一個參數的任何指示。如果您需要獲取帶註釋的元素,請致電getElementsAnnotatedWith查看您感興趣的每個註釋。

我想獲得類信息註解@Table和@測試,使用它們來生成一個XML文件

您還沒有描述你的處理器和@Table@Test註釋目的的確切目標,但是如果其中一個類引用了另一個類(例如@Table-annated類包含@Test -annotated類型的方法簽名),則可以使用getTypeElement來訪問該類,即使它沒有被getElementsAnnotatedWith返回。