Java の @inherited は、アノテーションが付けられたクラスのサブクラスに継承されるアノテーションをマークするために使用されるアノテーションです。注釈はコンパイラに追加情報を与えるメタデータを表すタグのようなものであることがわかっているため、 @inherited は組み込みの注釈です。 Javadoc に存在する組み込みアノテーションと同じように、Java に存在するものから別のメタ アノテーションを作成することができます。実際には 2 種類のアノテーションがあり、1 種類のアノテーションは @override のように Java コードに適用され、もう 1 種類のアノテーションは @target @inherited のように他のアノテーションに適用されます。したがって、 @inherited は、サブクラスを作成するか、別のユーザーにアノテーションを定義させるために継承したい他のアノテーションに適用されるアノテーションです。
広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文
Java の @inherited の構文は –
@Inherited public @interface MyAnnotation {// code of the MyAnnotation } @MyAnnotation public class SuperClass { // code of the SuperClass } public class SubClass extends SuperClass { // code of the SubClass }
上記の構文と同様、クラス SubClass は SuperClass から継承されており、SuperClass には @MyAnnotation アノテーションがあるため、クラス SubClass はアノテーション @MyAnnotation から継承されます。
@Inherited アノテーションが使用されるか、アノテーション (上記の構文の MyAnnotation) にアノテーションが付けられます。これには @interface がプレフィックスを付ける必要があります。次に、このアノテーション (MyAnnotation) を @MyAnnotation として適用する必要がある場所で使用できます。これらのアノテーションは、要素の宣言の直前に適用でき、変数、クラス、コンストラクター、メソッドなどのプログラムの任意の要素に適用できます。このユーザー定義のアノテーションがスーパークラスにアノテーション付けされると、自動的に継承されます。以下の例でわかるように、サブクラス (上記の構文のサブクラス)。
次に、@Inherited アノテーションをより明確に理解するための Java コードを作成します。以下の例では、@Inherited アノテーションを使用してスーパークラスからサブクラスを継承します。
まず、名前とコードの 2 つのフィールドを持つアノテーション @MyAnnotation のインターフェースを作成します。
コード: //MyAnnotation.java
package demo; import java.lang.annotation.Inherited; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Inherited @Target ({ElementType.TYPE, ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) public @interface MyAnnotation { String name () default "unknown"; String code () default " "; }
次に、任意のクラス、メソッド、または変数に注釈を付けて、状態名と状態コードを指定することで、上記の注釈を使用するスーパークラスを作成します。
コード: //Super.java
package demo; import demo.MyAnnotation; @MyAnnotation (name = "Karnataka", code = "KA") public class Super { public String getstateinfo () { return null; } }
次に、注釈はメタデータであるため、注釈を使用します。つまり、必要なときに注釈情報を使用するために、このメタデータまたは情報を取得できる必要があります。
コード: //Demo.java
//as sub class package demo; import demo.MyAnnotation; import demo.Super; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; public class Demo extends Super { public static void main ( String[] arg ) throws Exception { new Super (); Class <Super>obj = Super.class; getstateinfo (obj); Method m = obj.getMethod ("getstateinfo", new Class[]{}); getstateinfo (m); } static void getstateinfo (AnnotatedElement e) { try { System.out.println ("Finding annotations on " + e.getClass ().getName ()); Annotation[] annotations = e.getAnnotations (); for (Annotation a : annotations) { if (a instanceof MyAnnotation) { MyAnnotation stateInfo = (MyAnnotation) a; System.out.println("Name of Annotation :" + stateInfo.annotationType ()); System.out.println("State Name :" + stateInfo.name ()); System.out.println("State code :" + stateInfo.code ()); System.out.println(new Demo ().getClass ().getAnnotation (MyAnnotation.class)); System.out.println(new Super ().getClass ().getAnnotation (MyAnnotation.class)); } } } catch (Exception ex) { System.out.println( ex ); } } }
出力: Demo.java クラスを実行すると、出力は次のようになります。
説明: 上記のコードと同様に、MyAnnotation アノテーションが作成され、@Inherited によってアノテーションも付けられます。スーパークラスでは、MyAnnotation アノテーションはステートメント @MyAnnotation によって使用され、クラスにアノテーションが付けられました。そして、別のクラス Demo が作成されます。これは、スーパークラスに拡張されるため、スーパークラスのサブクラスになります。 Demo クラスの main () メソッドのさらに奥では、スーパークラスのオブジェクトが getstateinfo () メソッドを作成してアクセスし、このメソッドを通じてすべての注釈を反復処理し、注釈が MyAnnotation にあるかどうかを確認し、そうであればいくつかの内容を出力します。上記でわかるように、情報の一部です。ただし、重要なことの 1 つは、Demo クラスまたはその要素のいずれかに MyAnnotation の注釈が付けられていないにもかかわらず、MyAnnotation がスーパークラスに固有であり、スーパークラスが MyAnnotation を継承しているため、MyAnnotation がこのクラスに注釈が付けられていることを示していることです。
次に、上記の Java コードを書き直して、@Inherited アノテーションをより明確に理解できるように次の例を使用します。このアノテーションが継承されているかどうかを確認するために、MyAnnotation (上の例で作成されたアノテーション) に @Inherited アノテーションを使用しません。以下のように、スーパークラスのサブクラス内かどうか –
Super.java クラスと Demo.java クラスは上記と同じにし、これらのクラスには変更を加えませんが、MyAnnotation.java クラスではほとんど変更を加えず、MyAnnotation から注釈を付ける @Inherited アノテーションを削除するだけです。以下に示すように –
コード: //MyAnnotation.java
package demo; import java.lang.annotation.Inherited; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // no @Inherited @Target ({ElementType.TYPE, ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) public @interface MyAnnotation { String name () default "unknown"; String code () default " "; }
出力: 次に、Demo.java クラスを実行すると、出力は次のようになります。
説明: 上記の出力のように、状態コードの後に「null」値が出力されることがわかります。これは、ステートメント「new Demo ().getClass ()」の戻り値です。 .getAnnotation (MyAnnotation.class)」。これは、@Inherited アノテーションがサブクラスで継承するために MyAnnotation にアノテーションが付けられていないため、デモ クラスはそのスーパークラスから MyAnnotation アノテーションを継承 (またはアノテーション) されていないことを意味します。
Java の @inherited は、別のアノテーションに適用される組み込みアノテーションです。これは、アノテーションが付けられたクラスのサブクラスに継承されるアノテーションをマークするために使用されます。 @inherited は java.lang.annotation.Inherited.
パッケージで使用できます。以上がJava @継承の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。