Javaアノテーションを理解する– Java @ annotationsチュートリアル
公開: 2019-10-22
アノテーションはJavaでどのようにどこで使用されますか?
Javaコンピュータプログラミング言語の注釈は、Javaソースコードに追加できる特殊な形式の構文メタデータです。
クラス、メソッド、変数、パラメーター、およびパッケージに注釈を付けることができます。 Javadocタグとは異なり、Javaアノテーションは、コンパイラによって生成されたクラスファイルに埋め込むことができ、実行時に取得できるようにJavaVMによって保持される可能性があるという点で反映できます。
Javaの既存の注釈からメタ注釈を作成することが可能であり、これによりこの概念がより洗練されたものになります。
Javaは、言語に組み込まれている一連の注釈を定義します。

Javaコードに適用される注釈:
- @Override –関数がオーバーライドであることを確認します。 関数が親クラスの1つに見つからない場合、コンパイル警告を発生させます。
- @Deprecated –関数を廃止としてマークします。 関数が使用されている場合、コンパイル警告を発生させます。
- @SuppressWarnings –アノテーションパラメータで指定されたコンパイル時の警告を抑制するようにコンパイラに指示します。
他の注釈に適用される注釈:
- @Retention –マークされたアノテーションの保存方法を指定します—コードのみ、クラスにコンパイル、または実行時にリフレクションを通じて使用可能かどうか。
- @Documented –ドキュメントに含めるために別の注釈をマークします。
- @Target –別の注釈をマークして、注釈を適用できるJava要素の種類を制限します。
- @AliExpress –アノテーション付きクラスのサブクラスに継承される別のアノテーションをマークします(デフォルトでは、アノテーションはサブクラスに継承されません)。
サンプル例でこれらを見てみましょう:
1)@Overrideアノテーション:
その存在は、注釈付きメソッドが既存のスーパークラスメソッドをオーバーライドする必要があることをコンパイラーに示します。
@Overrideの最も一般的な使用例は、 Objectメソッドを使用する場合です。
1 2 3 4 |
@ Override public int hashValue ( ) { System . out . Println ( "This method is using @Override Annotation" ) ; } |
@Overrideが作成された主な理由は、単純な誤植に対処するためでした。
たとえば、誤って次のように宣言されたメソッド
1 |
public int hashvalue ( ) { . . . } |
実際にはオーバーライドではありません。メソッド名にはすべて小文字が含まれているため、 hashValue()メソッドの名前と完全には一致しません。 ただし、完全にコンパイルされます。 このようなエラーは簡単に発生し、キャッチするのは困難です。これは危険な組み合わせです。 @Overrideアノテーションを使用すると、このようなエラーを防ぐことができます。
スーパークラスメソッドをオーバーライドするときは常に、 @ Overrideを使用する習慣を身に付ける必要があります。

2)@Deprecated Annotation:
この注釈は、マークされた要素が非推奨であり、使用されないことを示しています。 プログラムが@Deprecated
アノテーション付きのメソッド、クラス、またはフィールドを使用するたびに、コンパイラーは警告を生成します。
要素が非推奨になると、次の例に示すように、Javadoc @deprecated
タグを使用して文書化する必要があります。
1 2 3 4 |
< strong > @ Deprecated < / strong > static void deprecatedMethod ( ) { System . out . Println ( "This method is Deprecated.." ) ; } |
3)@SuppressWarningsアノテーション:
コンパイラに伝えてください、叫ばないでください。 私は自分が何をしているのか知っています。
1 2 3 4 |
@ SuppressWarnings ( "serial" ) public class OldCode implements Serializable { System . out . Println ( "This is Old Code.." ) ; } |
4)@Retentionアノテーション:
保持注釈は、このタイプの注釈を保持する場所と期間を示します。
3つの値があります:
- RetentionPolicy.SOURCE :このタイプの注釈は、ソースレベルでのみ保持され、コンパイラによって無視されます。
- RetentionPolicy.CLASS :このタイプの注釈は、コンパイル時にコンパイラによって保持されますが、VMによって無視されます。
- RetentionPolicy.RUNTIME :このタイプの注釈はVMによって保持されるため、実行時にのみ読み取ることができます。
1 2 3 4 |
@ Retention ( RetentionPolicy . RUNTIME ) public @ interface Crunchify_Retention { String returnSomething ( ) ; } |
5)@Documented Annotation:
1 2 3 4 |
@ Documented public @ interface Crunchify_Documented { String writeDocument ( ) ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class DocumentedAnnotations { public static void main ( String arg [ ] ) { new DocumentedAnnotations ( ) . performRetention ( ) ; new DocumentedAnnotations ( ) . performDocumented ( ) ; } @ Crunchify_Retention ( returnSomething = "Hello retention test" ) public void performRetention ( ) { System . out . printf ( "Testing annotation 'Crunchify_Retention'" ) ; } @ Crunchify_Documented ( writeDocument = "Hello document" ) public void performDocumented ( ) { System . out . printf ( "Testing annotation 'Crunchify_Documented'" ) ; } } |
次に、Java Docコマンドを実行して、出力を確認してください。

6)@Targetアノテーション:
ターゲットは、注釈付き注釈タイプのインスタンスを使用して注釈を付けることができるプログラム要素を示します。 Targetの値は、 java.lang.annotation.ElementType
列挙型のメンバーの1つです。
- ANNOTATION_TYPE。 注釈付き注釈タイプは、注釈タイプ宣言に注釈を付けるために使用できます。
- コンストラクタ。 注釈付き注釈タイプは、コンストラクター宣言に注釈を付けるために使用できます。
- 分野。 注釈付き注釈タイプは、フィールド宣言に注釈を付けるために使用できます。
- LOCAL_VARIABLE。 注釈付き注釈タイプは、ローカル変数宣言に注釈を付けるために使用できます。
- 方法。 アノテーション付きアノテーションタイプは、メソッド宣言にアノテーションを付けるために使用できます。
- パッケージ。 注釈付き注釈タイプは、パッケージ宣言に注釈を付けるために使用できます。
- パラメータ。 注釈付き注釈タイプは、パラメーター宣言に注釈を付けるために使用できます。
- タイプ。 注釈付き注釈タイプは、型宣言に注釈を付けるために使用できます。
1 2 3 4 |
@ Target ( value = METHOD ) You can have multiple values in the Target annotation . @ Target ( value = { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } ) |
7)@Explicit Annotation:
名前が聞こえるように、 @Inherited
アノテーションタイプはアノテーション付きタイプのサブクラスに継承されます。
1 2 3 4 5 6 7 8 9 10 |
@ Inherited @ interface ForEveryone { } @ interface JustForMe { } @ ForEveryone @ JustForMe class Superclass { } class Subclass extends Superclass { } |
この例では、 Superclass
に@ForEveryone
と@JustForMe
の両方で明示的にアノテーションが付けられています。 Subclass
はどちらも明示的にマークされていません。 ただし、@ ForEveryoneには@Inherited
のアノテーションが付けられているため、 @ForEveryone
を継承します。
@JustForMe
にはアノテーションが付けられていないため、 Subclass
に継承されません。
これがクラスレベルのアノテーションです
