2017-08-06 5 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()); 
} 

Iクリーンな出力ディレクトリ@Tableを注釈付きクラスと@TestJava AbstractProcessorに関するいくつかの質問?私のプロジェクトで

注釈付きクラスを持っているとのIntelliJ、出力に2つのラインの構築:2つの行を持っている理由

annotations size 2 
annotations size 0 

を? javacは何をしましたか?

それを再構築すれば何も印刷されません。私はjavacが新しい.classを生成しないようにソースコードを変更しないと思います。 @Tableで注釈を付けたクラスを修正して再構築すると、出力はannotations size 1になります。私は@Test注釈クラスを変更していないので、のAPTは@Tableの情報を得ることができません。

@Table@Testというアノテーションが付いたクラス情報を取得し、それらを使用してxmlファイルを生成します。例を挙げる:クラスAは@Tableと注釈され、クラスBは@Testと注釈され、APTはクラスAとBのフィールドとメソッドを取得し、それらを新しいファイルに書き込みます。したがって、クラスAのみを変更していくつかのフィールドとメソッドを変更するとします.BuildとAPTプロセッサは、@TestというアノテートされたクラスBを取得できません。最新のxmlファイルを生成できません。確かに、私は出力ディレクトリをきれいにして再構築しますが、それはうまくいくでしょうが、そのようなことをする人はいません。だから誰もクラスを変更する、どのようにAPTプロセッサはすべてのクラス情報を取得することができます。

+0

質問は明らかではありません、plz [ask]を参照してください。 – 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の最新バージョンhave disabledインクリメンタルコンパイルではアノテーションプロセッサとの互換性が悪いです。

簡単な方法が必要な場合は、アノテーションプロセッサのユーザーにインクリメンタルコンパイルも無効にしてもらいます。または、増分コンパイルと互換性があるようにプロセッサを再設計することもできます。これは複雑な作業です。興味がある場合は、別の質問をすることをお勧めします。

は私が

1が何かの指標としてprocessの最初の引数を使用しないでください出力注釈サイズ、@Table注釈付きクラスを変更して再構築します。アノテートされた要素を取得する必要がある場合は、興味のあるアノテーションごとにgetElementsAnnotatedWithを呼び出します。あなたは正確にあなたのプロセッサの目標と@Table@Test注釈の目的を説明していない私は、クラス情報は、@Tableと@Test注釈付き取得したい

、xmlファイルを生成するために、これらを使用し

一方のクラスが別のクラスを参照している場合(@Table-annotatedクラスには@Testのアノテーション付きの型シグネチャが含まれています)、getElementsAnnotatedWithによって返されない場合でもgetTypeElementを使用してそのクラスにアクセスできます。

関連する問題