まず、アノテーション処理の方法だが、Java1.5の頃からあった「apt (Annotation Processing Tool)」ではなく、1.6から追加された「Pluggable Annotation Processing API」を使用してみた。
細部のプログラミング方法は異なるが(ただ片方理解していれば十分応用できる範囲)、eclipseで作ってデバックして利用するためのポイントはほとんど同じなので、参考にして欲しい。
おおまかな手順はこんな感じだ。
1.アノテーション用のプロジェクトを作ってjarにする。
2.アノテーションを使いたいプロジェクトからjarへClasspathを通す。
3.アノテーションを使いたいプロジェクトのプロパティで「注釈処理」→「ファクトリパス」の設定を行う。
尚、今回は「@SampleAnno」というマーカーアノテーションを作成してみた。
詳細なプログラミング方法はこちらの連載記事が非常にわかりやすいので、本気で作ってみようと考えている方はまず目を通して欲しい。
「Java SE 6完全攻略」第94回 アノテーションを処理する
1.
マーカーアノテーションの宣言:SampleAnno.java
package jp.mitusruog.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface SampleAnno {}
つぎに、アノテーションを処理するProcesser部分:SampleAnnoProcessor.java
package jp.mitusruog.annotation.processor;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
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.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.util.ElementScanner6;
import javax.tools.Diagnostic.Kind;
import jp.mitusruog.annotation.SampleAnno;
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("jp.mitusruog.annotation.SampleAnno")
public class SampleAnnoProcessor extends AbstractProcessor {
private Filer filer;
private Messager messager;
@Override
public boolean process(Set annotations,
RoundEnvironment roundEnvironment) {
filer = processingEnv.getFiler();
messager = processingEnv.getMessager();
class SampleAnnoScanner extends ElementScanner6<Void, Void>{
/**
* Type要素(Classとか)についてのアノテーション処理
*/
@Override
public Void visitType(TypeElement elem, Void p) {
if(elem.getAnnotation(SampleAnno.class) != null){
messager.printMessage(Kind.NOTE, "visitType:" + elem);
}
return super.visitType(elem, p);
}
/**
* 変数要素についてのアノテーション処理
*/
@Override
public Void visitVariable(VariableElement elem, Void p) {
messager.printMessage(Kind.NOTE, "variable:" + elem, elem);
return super.visitVariable(elem, p);
}
}
//Scannerの作成
SampleAnnoScanner scanner = new SampleAnnoScanner();
for (Element element : roundEnvironment.getRootElements()) {
//Root要素から順にScan
scanner.scan(element);
}
return true;
}
}
次がMETA-INFの設定で(実はここが一番苦労したポイントだった)、下のようなフォルダ構成(「src」がコンテキストルート)の場合、その直下に「META-INF」フォルダを作成して、その中に「javax.annotation.processing.Processor」ファイルを作成する。
フォルダ構成
src ├jp(→ここにソースファイルが入る) └META-INF └services └javax.annotation.processing.Processor
javax.annotation.processing.Processorファイル
jp.mitusruog.annotation.processor.SampleAnnoProcessor
ファイルの中には上で作成したProcessorクラスのFQNを設定する。
で、ここまで準備できたら、eclipseのエクスポート機能か何かでjarを作って1.の手順は完了。
2.
jarにclasspathを通すところはたぶん知っていると思うので割愛。
3.
eclipseのプロジェクトのプロパティを開いて
「Javaコンパイラ→注釈処理→ファクトリー・パス」まで行ったら、右側の「Jarの追加(もしくは外部Jarの追加)」で先ほど作成したjarを追加する。
アノテーションを利用する側のソース:Sample5.java
import java.util.Date;
import jp.mitusruog.annotation.SampleAnno;
@SampleAnno
public class Sample5 {
private int no;
private String name;
private String address;
private Date date;
}
ここで、「@」を入力した後に「Ctl+スペース」で入力補完のリストを表示させてみて「@SampleAnno」が候補としてあがってない場合は、「javax.annotation.processing.Processor」ファイルの内容が正しくない可能性が高いので再度確認して欲しい。
デバックについてはAptina Unitが良さそう。
まだ十分に使ってないので、なんとも言えないがassertが親切だったた結構使えると思う。
![JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス [大型本] / Douglas Crockford (著); 水野 貴明 (翻訳); オライリージャパン (刊) JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス [大型本] / Douglas Crockford (著); 水野 貴明 (翻訳); オライリージャパン (刊)](https://images-fe.ssl-images-amazon.com/images/I/41H0Dk-K3PL._SL160_.jpg)
![ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール [大型本] / Steve Souders, スティーブ サウダーズ (著); 武舎 広幸, 福地 太郎, 武舎 るみ (翻訳); オライリージャパン (刊) ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール [大型本] / Steve Souders, スティーブ サウダーズ (著); 武舎 広幸, 福地 太郎, 武舎 るみ (翻訳); オライリージャパン (刊)](https://images-fe.ssl-images-amazon.com/images/I/51hIDIWHmYL._SL160_.jpg)
![達人に学ぶ SQL徹底指南書 (CodeZine BOOKS) [単行本(ソフトカバー)] / ミック (著); 翔泳社 (刊) 達人に学ぶ SQL徹底指南書 (CodeZine BOOKS) [単行本(ソフトカバー)] / ミック (著); 翔泳社 (刊)](https://images-fe.ssl-images-amazon.com/images/I/41ITBBEjKgL._SL160_.jpg)
![7つの習慣―成功には原則があった! [単行本] / スティーブン・R. コヴィー (著); Stephen R. Covey (原著); ジェームス スキナー, 川西 茂 (翻訳); キングベアー出版 (刊) 7つの習慣―成功には原則があった! [単行本] / スティーブン・R. コヴィー (著); Stephen R. Covey (原著); ジェームス スキナー, 川西 茂 (翻訳); キングベアー出版 (刊)](https://images-fe.ssl-images-amazon.com/images/I/51JHD9GEK0L._SL160_.jpg)
![人を動かす 新装版 [単行本] / デール カーネギー, Dale Carnegie, 山口 博 (著); 創元社 (刊) 人を動かす 新装版 [単行本] / デール カーネギー, Dale Carnegie, 山口 博 (著); 創元社 (刊)](https://images-fe.ssl-images-amazon.com/images/I/41r8hdo98sL._SL160_.jpg)
![自分の小さな「箱」から脱出する方法 [単行本(ソフトカバー)] / アービンジャー インスティチュート, 金森 重樹, 冨永 星 (著); 大和書房 (刊) 自分の小さな「箱」から脱出する方法 [単行本(ソフトカバー)] / アービンジャー インスティチュート, 金森 重樹, 冨永 星 (著); 大和書房 (刊)](https://images-fe.ssl-images-amazon.com/images/I/4105UXJNInL._SL160_.jpg)