自作Javaアノテーション実装例 - サンプル01

2010/04/07 17:43Update
TAGS: Java | アノテーション | サンプル | 注釈 | annotation

サンプルからJavaアノテーション実装方法について解説します。

Javaアノテーションについて、

Javaアノテーション機能 概要

■Javaアノテーション定義例
package com.test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface HelloAnnotation {
        public String value();
}


これで、属性valueを持つHelloAnnotationという名前のアノテーションが定義されます。
1)@Retention(RetentionPolicy.RUNTIME):value属性情報は実行時(ランタイム)にもVMによって保持される
2)@Target(ElementType.FIELD):注釈対象はフィールド(ElementType.FIELD)しかできない

使い方
import com.test.annotation.HelloAnnotation;

public class TestHelloAnnotation {
    @HelloAnnotation("hello")
    //@HelloAnnotation(value="hello")
    private String name;
    
    //...
}


■オプション属性の定義

上のサンプルでは、利用側は、
@HelloAnnotation("hello")
もしくは
@HelloAnnotation(value="hello")
のように、value属性を指定しないとエラーになります。

valueに設定しなくても良い【オプション属性】にするには、予めデフォルト値を設定する必要があります。
定義例:
        public String value() default "";

このように定義しておけば、利用側は
    @HelloAnnotation
    private String name;
のようにvalueを設定しなくてもよい。もちろん、
@HelloAnnotation("何らかの値")
でもOK。

■複数の属性の定義
定義例:
public @interface HelloAnnotation {
        public String value();
        public String name();
}


■属性の型について
試しに、
public @interface HelloAnnotation {
        public java.util.Date value();
}


のように定義してみます。
そして、以下のようにコンパイルエラーが表示されます。

注釈の属性 HelloAnnotation.value の型 Date が無効です。プリミティブ型、ストリング、ク
ラス、注釈、列挙型またはそれらの 1次元配列のみが許可されています。

アノテーションの属性の型には、intやdouble, float, booleanなどのプリミティブ型やString、Class型、アノテーション型、列挙型(enum)、及びこれらの1次元配列のみが許可されています。
※なぜなら、アノテーションはクラスやフィールド、メソッドを注釈するためのものであり、上記以外の型が許可されても、値をセットすることはできないためです。

例:
1)java.lang.Class型の定義例
public @interface HelloAnnotation {
        public Class value();
}


2)一元配列の定義例
public @interface HelloAnnotation {
    public String[] value();
}


3)プリミティブ型の定義例
public @interface HelloAnnotation {
    public double max();
}


4)列挙型(enum)の定義例
public @interface HelloAnnotation {
    public SEX value();
    enum SEX {
        M,
        W
    }
}


・・・
次回は、Javaアノテーションの解析(Parser)方法について解説します。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments