アノテーションプロセッサの処理順
apt(アノテーションプロセシングツール)はJava6以降、javacの機能のひとつとして処理されるようになった。
javac - Java プログラミング言語コンパイラ - 注釈処理
javacはコンパイル時に"-processorpath"で指定した検索パス上に以下の構成ファイルを見つけると、構文解析後そのファィルに記述されているアノテーションプロセッサを起動する。※
META_INF/services/javax.annotation.processing.Processor
このファィル中にはAbstractProcessorを実装したクラスのFQNを記述しておけば、javacが勝手にアノテーションプロセッサクラスを実体化して実行してくれる。
net.kazzz.AnnotationProcessorA net.kazzz.AnnotationProcessorB net.kazzz.AnnotationProcessorC
このように複数のファイル名を記述することでひとつのパス、又はjarアーカイブ内の複数のアノテーションプロセッサが実行される。
最近気がついたことだが(私が知らなかっただけだが)、このファイル(javax.annotation.processing.Processor)中に記述する順序がそのままアノテーションプロセッサの実行順序になっているようだ。
上記のように記述した場合、実際も
net.kazzz.AnnotationProcessorA ↓ net.kazzz.AnnotationProcessorB ↓ net.kazzz.AnnotationProcessorC
の順で動くことを確認している。
例えばプリプロセッサのように、他のプロセッサの前処理をさせたい(アノテーションの記述されたクラスやスタブを生成したい)場合は、このファイルの記述順を考える必要がある。ただし、記述する順に依存した実行系というのはトラブルの元なので、できるだけそのようなクラス設計は避けたい処ではある。
※Eclipseではプロラグインでこれらを処理するため、javacの引数を自分で操作する必要はない