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) ・・・