アノテーションプロセッサの処理順

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の引数を自分で操作する必要はない