JSR 308: Annotations on Java Types を試してみる2

checkers コンパイラープラグインを使って @NonNull アノテーションを使ってみる。

checkers コンパイラープラグインのビルド

http://groups.csail.mit.edu/pag/jsr308/ サイトの Download から jsr308-checkers.zip をダウンロードし、適当なディレクトリに展開。

checkers/build.properties ファイルの compiler.lib の値を JSR 308 langtools をビルドして生成された javac.jar のパスを指定するように変更し、Ant でビルドを実施。

>ant

@NonNull アノテーションの使用

checkers.jar に含まれる @NonNull アノテーションを使ったテストプログラムを以下のように作成。

NonNullTest.java

import java.util.*;
import checkers.quals.*;

public class NonNullTest {

    public static void main(String[] args) {

        List<@NonNull String> list = new ArrayList<@NonNull String>();

        list.add("test");
        list.add("てすと");

    //  以下を有効にすると java.lang.NoSuchMethodError が発生
    //  list.add(null);

        for (String item : list) {
            System.out.printf("%s, ", item);
        }
    }
}

checkers をビルドして生成された checkers.jar をクラスパスに設定、-typeprocessor オプションで checkers.nonnull.NonnullChecker を指定して langtools/dist/bin/javac.bat を実行し NonNullTest.java をコンパイル。

>javac -cp .;c:\jsr308-checkers\checkers\checkers.jar -typeprocessor checkers.nonnull.NonnullChecker NonNullTest.java

ここで、list.add(null); の箇所を有効化してコンパイルすると以下のようなエラーが発生してコンパイルに失敗する。@NonNull が効いてるって事なんだろうが、明らかにこのエラーは正常な動作じゃ無さそう。

注釈処理でキャッチされない例外がスローされました。
詳細は次のスタックトレースで調査してください。
java.lang.NoSuchMethodError: javax.annotation.processing.Messager.printMessageFr
omTree(Ljavax/tools/Diagnostic$Kind;Ljava/lang/CharSequence;Lcom/sun/source/tree
/Tree;Lcom/sun/source/tree/CompilationUnitTree;)V
        at checkers.source.SourceChecker.message(SourceChecker.java:215)
        at checkers.source.SourceChecker.report(SourceChecker.java:331)
        at checkers.subtype.SubtypeVisitor.visitAssignment(SubtypeVisitor.java:5
7)
  ・・・