アノテーションとは、Javaアプリケーションとほかのシステムを連携させるための仕組みです。この記事ではアノテーションの一覧と、自作する方法をご紹介します。これを見れば、具体的な使い方がわかります。
Javaプログラムとフレームワーク等を連携させてシステムを構築する場合、連携させるための設定情報をどこかに記述する必要がある。そのひとつの方法として、設定ファイルに記述するやり方がある。しかし、設定ファイルに記述する方法には次のような問題がある。
設定ファイルを別に用意する方法とは異なり、Javaプログラムのソースコード内に連携情報を記述するやり方がアノテーションである。
アノテーションとは、Javaのクラス、メソッド又はパッケージに対するメタデータであり、注釈として記入する。アノテーションはjava.lang.Annotationインタフェースを継承したインタフェースである。
アノテーションの使用例を示す。
class Foo {
@javax.annotaion.Resource
public void bar() {
// things to do
}
}
パッケージまたはアノテーションをインポート(import)すれば、パッケージ名は省略できる。
import javax.annotaion.Resource;
class Foo {
@Resource
public void bar() {
// things to do
}
}
java.langパッケージのクラスは、明示的にインポートしなくてもパッケージ名を省略できる。クラスと同様に、java.langパッケージのアノテーションに限り、明示的にインポートしなくてもパッケージ名を省略できる。
たとえば、java.lang.Deprecatedアノテーションは次のように記述できる。
// import java.lang.Deprecated; は不要
class Foo {
@Deprecated
public void bar() {
// things to do
}
}
次にJavaアノテーション一覧を示す。
| 分類 | アノテーション |
|---|---|
| Java SE | @Deprecated |
| @Override | |
| @SuppressWarning | |
| Java EE | @Resource |
| Bean Validation | @AssertFalse |
| @AssertTrue | |
| @DecimalMax | |
| @DecimalMin | |
| @Digits | |
| @Future | |
| @Max | |
| @Min | |
| @NotNull | |
| @Null | |
| @Past | |
| @Pattern | |
| @Size | |
| @Valid | |
| EJB | @TransactionAttribute |
| Guice | @Provides |
| JAX-RS | @Consumes |
| @Context | |
| @CookieParam | |
| @DefaultValue | |
| @DELETE | |
| @FormParam | |
| @GET | |
| @HeaderParam | |
| @MatrixParam | |
| @Path | |
| @PathParam | |
| @POST | |
| @Produces | |
| @PUT | |
| @QueryParam | |
| JAX-WS | @HandlerChain |
| @OneWay | |
| @SOAPBinding | |
| @WebMethod | |
| @WebParam | |
| @WebResult | |
| @WebService | |
| JAXB | @XmlSeeAlso |
| JMockit | @Mocked |
| JPA | @Column |
| @Entity | |
| @GeneratedValue | |
| @GenerationType | |
| @Id | |
| @Table | |
| JUnit | @After |
| @AfterClass | |
| @Before | |
| @BeforeClass | |
| @Ignore | |
| @Test | |
| FindBugs | @CheckForNull |
| @CheckReturnValue | |
| @DefaultAnnotation | |
| @DefaultAnnotationForFields | |
| @DefaultAnnotationForMethods | |
| @DefaultAnnotationForParameters | |
| @NonNull | |
| @Nullable | |
| @OverrideMustInvoke | |
| @SupressWarning | |
| SAStruts | @ActionForm |
| @Excecute | |
| @Maxbytelength | |
| @Maxlength | |
| @Required | |
| Seasar | @CSVColumn |
| @CSVEntity | |
| @CSVMaxByteLength | |
| @CSVMinByteLength | |
| @CSVRequired | |
| @CSVValidator | |
| @RemoveSession | |
| Spring Framework | @Validated |
| Super CSV | @CsvBean |
| @CsvColumn | |
| @CsvEquals | |
| @CsvRequire | |
| @CsvUnique | |
| @CsvUniqueHashCode |
アノテーションによっては、引数を受け取るものもある。
@SuppressWarning("unused")
public void foo() {
String s;
}
@java.lang.Deprecatedは、クラスやメソッドが非推奨であることを示すアノテーションである。
// import java.lang.Deprecated; は不要
@Deprecated
public class DeprecatedClass {
@Deprecated
public int deprecatedField;
@Deprecated
public void depreatedMethod() {
//
}
}
@java.lang.Overrideは、メソッドがスーパークラスのメソッドをオーバーライドしていることを示すアノテーションである。
スーパークラスのメソッド宣言をオーバーライドすることを示す。もしOverrideアノテーションを付けているにもかかわらず、スーパークラスのメソッドをオーバーライドしていない場合は、コンパイラがエラーメッセージを生成する。
たとえば、インタフェース実装クラスにおいて、インタフェース経由でアクセスすることを想定したメソッドにOverrideアノテーションを付ける。
EmployeeServiceインタフェースで以下のメソッドが定義されているとする。
public int insert(Employee entity) throws EntityExistsException;
実装クラスEmployeeServiceImplでは、@Overrideアノテーションを付ける。
@Override
public int insert(Employee entity) throws EntityExistsException
{
...
}
@java.lang.SuppressWarningは、引数で指定した警告をJavaコンパイラが出力しないようにするアノテーションである。
@SuppressWarningアノテーションは、引数で指定した警告をJavaコンパイラが出力しないようにする。
@SuppressWarning("警告名")
@SuppressWarning({"警告名1","警告名2", ...})
警告には次のものを指定できる。
| 警告 | 抑制される警告 |
|---|---|
| all | すべての警告 |
| cast | 不要なキャスト |
| deprecation | 非推奨のメソッドを使用している |
| fallthrough | switch文でbreakさせずに次のcaseに処理が移っている |
| finally | finally節が正常に完了できない |
| serial | Serializableインタフェースを実装しているのにSerialVersionUIDを定義していない |
| unchecked | 無検査キャスト |
| unused | 未使用の変数がある |
@javax.annotation.Resourceは、外部リソース(JDBCデータソース、JMS送り先、接続ファクトリ)への依存性を示すアノテーションである。
@Resource
private EmployeeDao employeeDao;
@Resource(name="fooDataSource")
private void setDataSource(DataSource ds) {
...
}
Bean Validationとは、バリデーション(入力チェック)用のフレームワークである。Bean Validationでは入力チェックのルール(制約:constraints)をアノテーションで定義する。JavaBeansのプロパティが取り得る値や条件をアノテーションとして指定することで、バリデーションが実行される。nullチェックなどの汎用的な入力チェックやそのエラーメッセージはあらかじめ定義されている。独自のアノテーションやバリデーションロジック、エラーメッセージを定義することもできる。
アノテーションが付けられた要素はfalseでなければならない。
アノテーションが付けられた要素はtrueでなければならない。
アノテーションが付けられた要素は数値かつ指定した最大値以下でなければならない。
アノテーションが付けられた要素は数値かつ指定した最小値以上でなければならない。
アノテーションが付けられた要素は指定した許容範囲内の数値でなければならない。
アノテーションが付けられた要素は将来の日付でなければならない。
アノテーションが付けられた要素は数値かつ指定した最大値以下でなければならない。
アノテーションが付けられた要素は数値かつ指定した最小値以上でなければならない。
アノテーションが付けられた要素はnull以外でなければならない。
アノテーションが付けられた要素はnullでなければならない。
アノテーションが付けられた要素は過去の日付でなければならない。
アノテーションが付けられた要素は指定した正規表現にマッチしなければならない。
アノテーションが付けられた要素は指定した境界に含まれなければならない。
プロパティ又はメソッドパラメータ、メソッド戻り値をバリデーション連鎖としてマークする。