Javaアノテーションとは? その一覧と仕組み、自作の方法

アノテーションとは、Javaアプリケーションとほかのシステムを連携させるための仕組みです。この記事ではアノテーションの一覧と、自作する方法をご紹介します。これを見れば、具体的な使い方がわかります。

アノテーションとは

Javaプログラムとフレームワーク等を連携させてシステムを構築する場合、連携させるための設定情報をどこかに記述する必要がある。そのひとつの方法として、設定ファイルに記述するやり方がある。しかし、設定ファイルに記述する方法には次のような問題がある。

設定ファイルを別に用意する方法とは異なり、Javaプログラムのソースコード内に連携情報を記述するやり方がアノテーションである。

アノテーションとは、Javaのクラス、メソッド又はパッケージに対するメタデータであり、注釈として記入する。アノテーションはjava.lang.Annotationインタフェースを継承したインタフェースである。

Javaアノテーションの使い方

アノテーションの使用例を示す。

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アノテーション一覧を示す。

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

Javaアノテーションの引数

アノテーションによっては、引数を受け取るものもある。

@SuppressWarning("unused")
public void foo() {
  String s;
}

@java.lang.Deprecated

@java.lang.Deprecatedは、クラスやメソッドが非推奨であることを示すアノテーションである。

// import java.lang.Deprecated; は不要

@Deprecated
public class DeprecatedClass {

  @Deprecated
  public int deprecatedField;

  @Deprecated
  public void depreatedMethod() {
    //
  }
}

@java.lang.Override

@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.lang.SuppressWarningは、引数で指定した警告をJavaコンパイラが出力しないようにするアノテーションである。

@SuppressWarningアノテーションは、引数で指定した警告をJavaコンパイラが出力しないようにする。

@SuppressWarning("警告名")
@SuppressWarning({"警告名1","警告名2", ...})

警告には次のものを指定できる。

@SupressWarningの警告一覧
警告 抑制される警告
all すべての警告
cast 不要なキャスト
deprecation 非推奨のメソッドを使用している
fallthrough switch文でbreakさせずに次のcaseに処理が移っている
finally finally節が正常に完了できない
serial Serializableインタフェースを実装しているのにSerialVersionUIDを定義していない
unchecked 無検査キャスト
unused 未使用の変数がある

@javax.annotation.Resource

@javax.annotation.Resourceは、外部リソース(JDBCデータソース、JMS送り先、接続ファクトリ)への依存性を示すアノテーションである。

@Resource
private EmployeeDao employeeDao;

@Resource(name="fooDataSource")
private void setDataSource(DataSource ds) {
  ...
}

Bean Validation

Bean Validationとは、バリデーション(入力チェック)用のフレームワークである。Bean Validationでは入力チェックのルール(制約:constraints)をアノテーションで定義する。JavaBeansのプロパティが取り得る値や条件をアノテーションとして指定することで、バリデーションが実行される。nullチェックなどの汎用的な入力チェックやそのエラーメッセージはあらかじめ定義されている。独自のアノテーションやバリデーションロジック、エラーメッセージを定義することもできる。

@javax.validation.constraints.AssertFalse

アノテーションが付けられた要素はfalseでなければならない。

@javax.validation.constraints.AssertTrue

アノテーションが付けられた要素はtrueでなければならない。

@javax.validation.constraints.DecimalMax

アノテーションが付けられた要素は数値かつ指定した最大値以下でなければならない。

@javax.validation.constraints.DecimalMin

アノテーションが付けられた要素は数値かつ指定した最小値以上でなければならない。

@javax.validation.constraints.Ditits

アノテーションが付けられた要素は指定した許容範囲内の数値でなければならない。

@javax.validation.constraints.Future

アノテーションが付けられた要素は将来の日付でなければならない。

@javax.validation.constraints.Max

アノテーションが付けられた要素は数値かつ指定した最大値以下でなければならない。

@javax.validation.constraints.Min

アノテーションが付けられた要素は数値かつ指定した最小値以上でなければならない。

@javax.validation.constraints.NotNull

アノテーションが付けられた要素はnull以外でなければならない。

@javax.validation.constraints.Null

アノテーションが付けられた要素はnullでなければならない。

@javax.validation.constraints.Past

アノテーションが付けられた要素は過去の日付でなければならない。

@javax.validation.constraints.Pattern

アノテーションが付けられた要素は指定した正規表現にマッチしなければならない。

@javax.validation.constraints.Size

アノテーションが付けられた要素は指定した境界に含まれなければならない。

@java.validation.Valid

プロパティ又はメソッドパラメータ、メソッド戻り値をバリデーション連鎖としてマークする。