Java アノテーション

Java アノテーション

ジャワ 注釈 を表すタグです。 metadata つまり、Java コンパイラと JVM で使用できる追加情報を示すクラス、インターフェイス、メソッド、またはフィールドが添付されます。

Java の注釈は追加情報を提供するために使用されるため、XML および Java マーカー インターフェイスの代替オプションとなります。

まず、いくつかの組み込みアノテーションについて学習し、次にカスタム アノテーションの作成と使用に進みます。


組み込みの Java アノテーション

Java にはいくつかの組み込みアノテーションがあります。注釈の中には Java コードに適用されるものと、他の注釈に適用されるものがあります。

Java コードで使用される組み込み Java アノテーション

  • @オーバーライド
  • @SuppressWarning
  • @非推奨

他のアノテーションで使用される組み込み Java アノテーション

  • @目標
  • @保持
  • @遺伝性の
  • @文書化されました

組み込みの注釈について理解する

まず、組み込みの注釈について理解しましょう。

@オーバーライド

@Override アノテーションは、サブクラス メソッドが親クラス メソッドをオーバーライドしていることを保証します。そうでない場合は、コンパイル時エラーが発生します。

場合によっては、スペルミスなどの愚かな間違いをしてしまうことがあります。そのため、メソッドがオーバーライドされることを保証する @Override アノテーションをマークすることをお勧めします。

 class Animal{ void eatSomething(){System.out.println('eating something');} } class Dog extends Animal{ @Override void eatsomething(){System.out.println('eating foods');}//should be eatSomething } class TestAnnotation1{ public static void main(String args[]){ Animal a=new Dog(); a.eatSomething(); }}  
今すぐテストしてください
 Output:Comple Time Error  

@SuppressWarning

@SuppressWarnings アノテーション: コンパイラによって発行される警告を抑制するために使用されます。

 import java.util.*; class TestAnnotation2{ @SuppressWarnings('unchecked') public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('sonoo'); list.add('vimal'); list.add('ratan'); for(Object obj:list) System.out.println(obj); }}  
今すぐテストしてください
 Now no warning at compile time.  

@SuppressWarnings('unchecked') アノテーションを削除すると、非ジェネリック コレクションを使用しているため、コンパイル時に警告が表示されます。


@非推奨

@Deprecated アノテーションは、このメソッドが非推奨であることを示すため、コンパイラは警告を出力します。将来のバージョンでは削除される可能性があることをユーザーに通知します。したがって、そのような方法は使用しないほうがよいでしょう。

 class A{ void m(){System.out.println('hello m');} @Deprecated void n(){System.out.println('hello n');} } class TestAnnotation3{ public static void main(String args[]){ A a=new A(); a.n(); }}  
今すぐテストしてください

コンパイル時:

 Note: Test.java uses or overrides a deprecated API. <br> Note: Recompile with -Xlint:deprecation for details.  

実行時:

 hello n  

Java カスタム アノテーション

Java カスタム アノテーション または Java ユーザー定義のアノテーションは簡単に作成して使用できます。の @インターフェース 要素は注釈を宣言するために使用されます。例えば:

 @interface MyAnnotation{}  

ここで、MyAnnotation はカスタム アノテーション名です。

Javaカスタムアノテーション署名の留意点

プログラマーが覚えておくべきポイントがいくつかあります。

  1. メソッドには throws 句を含めないでください
  2. メソッドは、プリミティブ データ型、文字列、クラス、列挙型、またはこれらのデータ型の配列のいずれかを返す必要があります。
  3. メソッドにはパラメータを含めないでください。
  4. アノテーションを定義するには、interface キーワードの直前に @ を付けます。
  5. メソッドにデフォルト値を割り当てる場合があります。

注釈の種類

注釈には 3 種類あります。

  1. マーカーの注釈
  2. 単一値のアノテーション
  3. 複数値のアノテーション
Java アノテーションの種類

1) マーカーの注釈

メソッドを持たないアノテーションは、マーカー アノテーションと呼ばれます。例えば:

 @interface MyAnnotation{}  

@Override と @Deprecated はマーカー アノテーションです。


2) 単一値のアノテーション

メソッドが 1 つあるアノテーションは、単一値アノテーションと呼ばれます。例えば:

 @interface MyAnnotation{ int value(); }  

デフォルト値も提供できます。例えば:

 @interface MyAnnotation{ int value() default 0; }  

単一値のアノテーションを適用する方法

単一値のアノテーションを適用するコードを見てみましょう。

 @MyAnnotation(value=10)  

値は何でも構いません。


3) 複数値のアノテーション

複数のメソッドを持つアノテーションは、Multi-Value アノテーションと呼ばれます。例えば:

 @interface MyAnnotation{ int value1(); String value2(); String value3(); } }  

デフォルト値も提供できます。例えば:

 @interface MyAnnotation{ int value1() default 1; String value2() default &apos;&apos;; String value3() default &apos;xyz&apos;; }  

複数値のアノテーションを適用する方法

複数値のアノテーションを適用するコードを見てみましょう。

 @MyAnnotation(value1=10,value2=&apos;Arun Kumar&apos;,value3=&apos;Ghaziabad&apos;)  

Java のカスタム アノテーションで使用される組み込みアノテーション

  • @目標
  • @保持
  • @遺伝性の
  • @文書化されました

@目標

@目標 タグは、どの型でアノテーションが使用されるかを指定するために使用されます。

java.lang.アノテーション。 要素タイプ enum は、TYPE、METHOD、FIELD など、アノテーションが適用される要素のタイプを指定するための多くの定数を宣言します。ElementType enum の定数を見てみましょう。

要素の種類 注釈を適用できる場所
タイプ クラス、インターフェイス、または列挙型
分野 田畑
方法 メソッド
コンストラクタ コンストラクター
LOCAL_VARIABLE ローカル変数
ANNOTATION_TYPE 注釈の種類
パラメータ パラメータ

クラスにアノテーションを指定する例

 @Target(ElementType.TYPE) @interface MyAnnotation{ int value1(); String value2(); }  

クラス、メソッド、フィールドにアノテーションを指定する例

 @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) @interface MyAnnotation{ int value1(); String value2(); }  

@保持

@保持 注釈は、どのレベルの注釈を使用できるかを指定するために使用されます。

保持ポリシー 可用性
RetentionPolicy.SOURCE コンパイル中に破棄されたソースコードを指します。コンパイルされたクラスでは使用できません。
RetentionPolicy.CLASS .class ファイルを指します。Java コンパイラでは使用できますが、JVM では使用できません。クラスファイルに含まれています。
RetentionPolicy.RUNTIME Java コンパイラと JVM で使用できるランタイムを指します。

RetentionPolicyの指定例

 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface MyAnnotation{ int value1(); String value2(); }  

カスタム注釈の例: 注釈の作成、適用、およびアクセス

アノテーションの作成、適用、アクセスの簡単な例を見てみましょう。

ファイル: Test.java

 //Creating annotation import java.lang.annotation.*; import java.lang.reflect.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface MyAnnotation{ int value(); } //Applying annotation class Hello{ @MyAnnotation(value=10) public void sayHello(){System.out.println(&apos;hello annotation&apos;);} } //Accessing annotation class TestCustomAnnotation1{ public static void main(String args[])throws Exception{ Hello h=new Hello(); Method m=h.getClass().getMethod(&apos;sayHello&apos;); MyAnnotation manno=m.getAnnotation(MyAnnotation.class); System.out.println(&apos;value is: &apos;+manno.value()); }}  
今すぐテストしてください
 Output:value is: 10  

この例をダウンロードする

組み込みのアノテーションは実際のシナリオでどのように使用されますか?

実際のシナリオでは、Java プログラマはアノテーションを適用するだけで済みます。注釈を作成してアクセスする必要はありません。アノテーションの作成とアクセスは実装プロバイダーによって実行されます。アノテーションに代わって、Java コンパイラまたは JVM がいくつかの追加操作を実行します。


@遺伝性の

デフォルトでは、アノテーションはサブクラスに継承されません。 @Inherited アノテーションは、サブクラスに継承されるアノテーションをマークします。

 @Inherited @interface ForEveryone { }//Now it will be available to subclass also @interface ForEveryone { } class Superclass{} class Subclass extends Superclass{}  

@文書化されました

@Documented ドキュメントに含める注釈をマークします。