Oct 14, 2005

[JSR] JSR 250 Common Annotations for the Java Platform ダイジェスト

Common Annotations for the Java Platform の仕様をざっと眺めたときのメモ。

JSR 250 Common Annotations for the Java Platform

オリジナルの入手はこちら → JSR 250

General Guidelines for Inheritance of Annotations

annotation が付加されたメソッドがサブクラスでオーバーライドされた場合、 どのように扱われるのかが曖昧。そのため、そのような場合におけるガイドラインを 以下の様に定義する。

  • クラスレベル annotation は自分自身のメンバー(メソッド、フィールド)のみを対象とする。
  • クラスレベル annotation よりメンバーレベル annotation の方が優先される。
  • インターフェースは実装されているクラス(メンバーを含む)に影響を与えない。
  • オーバーライドもしくは隠蔽されていないメンバーは子クラスにおいても親クラスの annotation を引き継ぐ。
  • オーバーライドもしくは隠蔽されているメンバーは子クラスにおいて親クラスの annotation の影響を受けない。

javax.annotation.Generated

自動生成されたコードを表す。 自動生成ツールの名称を必ず指定しなければならない。 自動生成された時刻を記述可能。時刻は ISO 8601 のフォーマットに従わなければならない。 ターゲットは ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE。

javax.annotation.Resource

DataSource などを自動でクラスにインジェクションするために利用される。 JNDI 名を指定することで、コンテナが JNDI から適切なリソースを取得しフィールドインジェクションもしくはメソッドインジェクションで対象オブジェクトに引き渡す。 ターゲットは TYPE, METHOD, Field。

javax.annotation.Resources

複数のリソースを必要とする場合、Resources を利用して複数の Resource をまとめる。 同一 annotation の複数回指定が認められていないため。 ターゲットは TYPE。

javax.annotation.PostConstruct

インジェクション終了直後に実行されるメソッドを表す。 オブジェクト生成→インジェクション→PostConstruct指定されたメソッド実行、というライフサイクルになる。 ターゲットは METHOD。 この annotation を付加されるメソッドには以下の制限がある。

  • パラメータは指定できない(但し、EJB interceptor における InvocationContext のみ可能)
  • 戻り値は void のみ。
  • チェック例外は throw できない。
  • アクセス識別子は public, protected, package private, private を指定可能。
  • static にできない。
  • final を指定可能。
  • 非チェック例外を throw した場合は、そのオブジェクトを利用してはいけない。

javax.annotation.PreDestroy

コンテナがオブジェクトを破棄する際に実行されるメソッドを表す。 ターゲットは METHOD。 この annotation を付加されるメソッドには以下の制限がある。

  • パラメータは指定できない(但し、EJB interceptor における InvocationContext のみ可能)
  • 戻り値は void のみ。
  • チェック例外は throw できない。
  • アクセス識別子は public, protected, package private, private を指定可能。
  • static にできない。
  • final を指定可能。
  • 非チェック例外を throw した場合、その例外は無視される。

javax.annotation.security.RunAs

クラスのロールを表す。 Java EE コンテナでクラスが実行される際、RunAs でクラスのロールを割り当てることができる。 ターゲットは TYPE。

javax.annotation.security.RolesAllowed

クラス、メソッドの実行権限を持つロールを指定する。 ターゲットは TYPE, METHOD。

javax.annotation.security.PermitAll

全てのロールが実行権限を持つことを表す。 PermitAll が指定されたクラス、メソッドは権限に関して未チェックで実行される。 ターゲットは TYPE, METHOD。

javax.annotation.security.DenyAll

全てのロールが実行権限を持たないことを表す。 DenyAll が指定されたクラス、メソッドは Java EE コンテナ上では実行できない。 ターゲットは METHOD。

PermitAll, DenyAll and RolesAllowed interactions

  • PermitAll, DenyAll, RolesAllowed は特定のクラスもしくはメソッドに同時に指定することはできない。
  • DenyAll がクラスレベルで指定されている場合、メソッドに PermitAll, RolesAllowed が指定されると PermitAll, RolesAllowed が優先される。
  • RolesAllowed がクラスレベルで指定されている場合、メソッドに DenyAll, PermitAll が指定されると DenyAll, PermitAll が優先される。

謎) DenyAll のターゲットは METHOD のみなのに、ここではクラスレベルで指定できると書かれている。どちらが正しいの??

javax.annotation.security.DeclareRoles

テスト等で使用するためのロールを定義する。 ターゲットは TYPE。