読者です 読者をやめる 読者になる 読者になる

ITお絵かき修行

3歩歩いても忘れないために

aptを使ったアノテーション処理

apt(Annotation Processing Tools)を使用してソースコード内のアノテーションを読み込む。
JSR-175に準拠したcom.sun.*パッケージのMirrorAPIではなく、JSR-269に準拠したaptを使用する。

JEP-117にて、aptが内部で使用するクラスが、JavaSE6より追加されたjavax.annotation.processingもしくはjarax.lang.modelパッケージに含まれるクラスになった。
※MirrorAPIを使用したaptはJavaSE8より削除対象となった。

「参考」
JEP 117: Remove the Annotation-Processing Tool (apt)
Oracle Blogs 日本語のまとめ: [Java] Java 8's new Type Annotations


javax.annotation.processing インタフェース Processor

Java Platform SE 6

ツールは、「検出処理」を使って注釈プロセッサを見つけ出し、それらを実行すべきかどうかを決定します。ツールを構成することで、可能性のあるプロセッサのセットを制御できます。たとえば、JavaCompiler の場合、実行候補プロセッサのリストは、直接設定 することも、サービススタイル の検索で使用される検索パス を使って制御することもできます。

実際に注釈プロセッサを作ってみた。
javac呼び出し時に、作成した注釈プロセッサを指定し実行する。
実装自体はアノテーションが設定可能な場所に設定されているアノテーション名を出力するだけ。

【実行環境】
jdk1.7.0_60

【実装】

package annotation;


import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;

@SupportedSourceVersion(SourceVersion.RELEASE_7) // Javaのバージョン
@SupportedAnnotationTypes({ "*" }) // 抽出対象とするアノテーションクラスの指定
public class SampleProcessor extends AbstractProcessor{

	@Override
	public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for( TypeElement element : annotations ) { // TypeElementクラスがアノテーションの要素にあたる
            System.out.println( element.toString() );
        }
        return true;
	}
}


【実行コマンド】

javac -cp (クラスパス) -proc:only -processor (プロセッサのクラス名(完全修飾)) (javaファイル)

D:\workspace\workspace_annotation_20141120\ProcessorProject>set CP=./bin

D:\workspace\workspace_annotation_20141120\ProcessorProject>javac -cp %CP% -proc:only -processor processor.SampleProcessor src\annotation\SampleAnnotated.java
Sample

D:\workspace\workspace_annotation_20141120\ProcessorProject>tree /f

D:.
│
├─bin
│  ├─annotation
│  │      Sample.class
│  │      SampleAnnotated.class
│  │
│  └─processor
│          SampleProcessor.class
│
└─src
    ├─annotation
    │      Sample.java
    │      SampleAnnotated.java
    │
    └─processor
            SampleProcessor.java

D:\workspace\workspace_annotation_20141120\ProcessorProject>

今度は取得するアノテーションの種類、取得対象のソースファイルの指定など、入出力の
仕様を柔軟にしてみる。


【参考】
JDK 6 Java Compiler (javac)-related APIs & Developer Guides
javac - Java programming language compiler
Java SE 6 and JWSDP 2.0:6


「追記 2015/01/09」
Java8でも上記プログラムは正常に動作した。
※ただし@SupportedSourceVersionで指定するバージョンは「8」へ変更した。
ゆえにapt自体はJavaSE8であっても動作する。