JavaのAnnotation。
Pluggable Annotation Processing APIというらしいのだが、動いているかどうかがわからん。。。
見ていくと、Aptina Unitを使うのがよい、と書いているところが多かった。
よくわからないなりに、人々のサイトを参考にしながらやってみた。
こちらが、一番参考にさせていただいたサイト。
Aptinaを利用するとAPTのテストが簡単に書けたよ - kurukuru-papaの日記
ここまで解説があってもわからないのが初心者の哀しいところよ。。。
使っているのは、ADT Build v21.1.0-569685。
JUNOベースらしい。
なお、動かしてみただけなので、やりかたが正しいかどうかはわからんです。
まず、Java Projectを作る。
ここでは「Java_Test6Unit」という名前で進める(なんて適当な名前なんだ・・・)。
srcフォルダの下に、自作Annotation一式のソースファイルを置く。
「下に」といっても、Javaファイルをそのまま置くのではなく、ちゃんとフォルダを掘るのだ。
私は「com.blogpost.hiro99ma.anno」というパッケージ名だったので、そう掘った。
名前はGetSetだが、中身はgetterとかsetterとは関係が無い。
あとでがんばろう。。
GetSet.java
package com.blogpost.hiro99ma.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)@Target(ElementType.TYPE)public @interface GetSet {boolean setter() default true;boolean getter() default true;String prop();}
GetSetProcessor.java
package com.blogpost.hiro99ma.anno;
import java.io.IOException;
import java.io.PrintWriter;
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.tools.Diagnostic.Kind;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
@SupportedSourceVersion(SourceVersion.RELEASE_6)@SupportedAnnotationTypes("com.blogpost.hiro99ma.anno.GetSet")
public class GetSetProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {if (annotations.size() == 0) {
//annotation処理済み
return true;}Messager messager = processingEnv.getMessager();Filer filer = processingEnv.getFiler();try {
FileObject file = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "hiro99ma.txt", (Element)null);PrintWriter writer = new PrintWriter(file.openWriter(), true);//annotationが使用されている要素
for (TypeElement anno : annotations) {
for (Element elem : roundEnv.getElementsAnnotatedWith(anno)) {
GetSet getset = elem.getAnnotation(GetSet.class);
//propに設定されている文字列が"hiro99ma"だったらメッセージを出す
if (getset.prop().equals("hiro99ma")) {writer.println("おう : " + elem);
messager.printMessage(Kind.NOTE, "You must be HIRO99MA.", elem);
}}}} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();}return true;}}
自作Annotationを使うJavaファイルを作る。
場所はどこでもいいのだろうが、同じパッケージにした。
名前も何でもよさそうなので、「Foo」にした。
package com.blogpost.hiro99ma.anno;
@GetSet(prop = "hiro99ma")
public class Foo {}
AptinaTestCaseをextendsしたclassを作る。
これが、Foo.javaをコンパイルして、実行までやってくれるようだ。
package com.blogpost.hiro99ma.anno;
import java.nio.charset.Charset;
import java.util.Locale;
import org.seasar.aptina.unit.AptinaTestCase;
public class TestProcessorTest extends AptinaTestCase {public TestProcessorTest(String name) {
super(name);
}@Overrideprotected void setUp() throws Exception {super.setUp();
setLocale(Locale.JAPANESE);setCharset(Charset.forName("UTF-8"));
addSourcePath("src");
}public void test() throws Exception {GetSetProcessor processor = new GetSetProcessor();
addProcessor(processor);addCompilationUnit(Foo.class);
compile();assertEqualsGeneratedSourceWithFile("oops.txt",
"com");
}}
サイトの方も書かれているが、setUp()でsetLocale()などをやらないと、addCompilationUnit()がエラーになってしまった。
あと、addSourcePath()で追加するのは、いわゆる「ソースフォルダ」の先頭みたいだ。
「src/com/・・・」と指定してたが、だめだったのだ。
ここまで追加すると、Eclipseがエラーをあれこれ出しているので、プロジェクトの設定をする。
もちろん、最初にやっててもよい。
まず、Aptina UnitのJARファイルを追加する。
ここからダウンロードし(今はAptina-1.0.0.zipだった)、解凍する。
中に「lib」フォルダがあり、その中に「aptina-unit-x.x.x.jarが入っている(私はaptina-unit-1.0.0.jar)。
これを適当にコピーして、プロジェクトの設定でLibrariesに追加。
これでよいかと思ったが「junit.frameworkがない」みたいなことを言われる。。。
よくわからんので、JUnit4をダウンロードして同じように追加した。
したのだが、もっと普通の方法があった。
上の画面で「Add Library ...」を押すと、JUnitが選択できる。
JUnit3かJUnit4かを迫られるので、新しい方がいいんじゃないの、と思ってJUnit4にした。
ここまでやると、Eclipseのエラーが出なくなった。
なお、プロジェクト設定でAnnotation Processingの設定は不要だ。
では、実際に動かしてみよう。
動いたかどうかがわからないというレベルなので、まずは自作のProcessorクラスのprocess()先頭にブレークポイントを設定。
そして、プロジェクト名で右クリックし、「Debug As > JUnit Test」を選択。
「Use configuration specific settings」にチェックし「Eclipse JUnit Launcher」を選択。
ここで「Java Application」を選択しても、ダメですぞ(それで悩んでた)。
そうすると、ブレークポイントのところで止まるんじゃないかね。
私のところは止まったよ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。