注釈の主な利点は、JDK にすでに含まれている標準的な注釈を使用することから得られるものではありません。同時に、独自の注釈を作成する必要はほとんどありません。しかし、大規模なシステムを開発している場合、または別のライブラリを作成している場合、アーキテクチャ レベルでは、独自のアノテーションを実装することで確実に利益が得られます。

アノテーションを作成してみましょう。

これを行うには、ファイルを作成しますが、classまたはinterfaceを記述する代わりに、@interfaceを記述します。これがアノテーション用のファイルになります。アノテーションの内部構造はインターフェースの内部構造と似ています。


public @interface Sum {
   int sum() default 0;
}

@interface はこれが注釈であることを示し、
defaultはパラメータが特定のデフォルト値を持つことを示します。

タダ!注釈を作成しました。理論的にはすでに使用できますが、最初に設定することをお勧めします。

設定を行わなければ、アノテーションは何にでも (クラス、メソッド、属性など) 適用できるため、この時点でアノテーションを使用することはほとんど意味がありません。奇妙に思われるかもしれませんが、私たちの注釈には他の注釈を付ける必要があります。

@Targetから始めましょう。

@Targetアノテーション(Java 1.5 以降に関連) は、アノテーションを適用する機能を制限します。使用を特定のレベルに制限するには、 @Targetアノテーションに引数を渡して、どの型に適用できるかを示す必要があります。一般的に使用されるタイプのいくつかを次に示します。

@Target(ElementType.PACKAGE) パッケージ用
@Target(ElementType.TYPE) 授業用
@Target(ElementType.CONSTRUCTOR) コンストラクター向け
@Target(ElementType.METHOD) メソッドの場合
@Target(ElementType.FIELD) クラス内の属性 (変数) の場合
@Target(ElementType.PARAMATER) メソッドパラメータの場合
@Target(ElementType.LOCAL_VARIABLE) ローカル変数の場合

複数の型の注釈が必要な場合は、複数の引数を配列として渡すことができます。


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

設定の次に重要な部分は@Retentionアノテーションです。

このアノテーションは、コード ライフ サイクルのどの部分でアノテーションが利用できるかを示します。

RetentionPolicy.SOURCE SOURCE保持ポリシーでマークされた注釈は実行時に破棄されます。
RetentionPolicy.CLASS CLASS保持ポリシーでマークされた注釈は.classファイルに書き込まれますが、実行時に削除されます。
RetentionPolicy.RUNTIME RUNTIME保持ポリシーでマークされた注釈は実行時に保持され、実行時にプログラムからアクセスできます。

構成に使用できるアノテーションが他にもいくつかあります。

注釈 価値
@遺伝性の 派生クラスが親クラスのアノテーションの実装を継承することを示します。
@文書化されました これは、生成された Javadoc ドキュメントにアノテーションが含まれることを示します。

次に、独自のアノテーションを作成してみましょう。

クラスとメソッド用のアノテーションを作成し、コードの作成者とバージョンに関する情報を含めます。


    @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

アノテーションをメソッドやクラスに適用できます。アノテーションのメタデータは実行時に利用可能になります。注釈のパラメータに注意してください。2 つの引数 (作成者とバージョン) を指定することも、省略することもできます。省略した場合は、指定されたデフォルト値 (デフォルト "Author"およびデフォルト "0.0" ) が使用されます。

パラメータのデフォルト値を指定する必要がないことに注意してください。この場合、パラメータは必須になります。

引数を渡すときは、 value = "value" という表記を使用して、対応するパラメータを指定する必要があります。注釈に単一のパラメータがある場合でも、パラメータには常に明示的に名前を付ける必要があります。

アノテーションをいくつかのクラスに適用してみましょう。


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}