ホームページ  >  記事  >  Java  >  Java @継承

Java @継承

WBOY
WBOYオリジナル
2024-08-30 16:22:26268ブラウズ

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 は Java でどのように機能しますか?

@Inherited アノテーションが使用されるか、アノテーション (上記の構文の MyAnnotation) にアノテーションが付けられます。これには @interface がプレフィックスを付ける必要があります。次に、このアノテーション (MyAnnotation) を @MyAnnotation として適用する必要がある場所で使用できます。これらのアノテーションは、要素の宣言の直前に適用でき、変数、クラス、コンストラクター、メソッドなどのプログラムの任意の要素に適用できます。このユーザー定義のアノテーションがスーパークラスにアノテーション付けされると、自動的に継承されます。以下の例でわかるように、サブクラス (上記の構文のサブクラス)。

Java で @Inherited アノテーションを実装する例

次に、@Inherited アノテーションをより明確に理解するための Java コードを作成します。以下の例では、@Inherited アノテーションを使用してスーパークラスからサブクラスを継承します。

例 #1

まず、名前とコードの 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 クラスを実行すると、出力は次のようになります。

Java @継承

説明: 上記のコードと同様に、MyAnnotation アノテーションが作成され、@Inherited によってアノテーションも付けられます。スーパークラスでは、MyAnnotation アノテーションはステートメント @MyAnnotation によって使用され、クラスにアノテーションが付けられました。そして、別のクラス Demo が作成されます。これは、スーパークラスに拡張されるため、スーパークラスのサブクラスになります。 Demo クラスの main () メソッドのさらに奥では、スーパークラスのオブジェクトが getstateinfo () メソッドを作成してアクセスし、このメソッドを通じてすべての注釈を反復処理し、注釈が MyAnnotation にあるかどうかを確認し、そうであればいくつかの内容を出力します。上記でわかるように、情報の一部です。ただし、重要なことの 1 つは、Demo クラスまたはその要素のいずれかに MyAnnotation の注釈が付けられていないにもかかわらず、MyAnnotation がスーパークラスに固有であり、スーパークラスが MyAnnotation を継承しているため、MyAnnotation がこのクラスに注釈が付けられていることを示していることです。

次に、上記の Java コードを書き直して、@Inherited アノテーションをより明確に理解できるように次の例を使用します。このアノテーションが継承されているかどうかを確認するために、MyAnnotation (上の例で作成されたアノテーション) に @Inherited アノテーションを使用しません。以下のように、スーパークラスのサブクラス内かどうか –

例 #2

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 クラスを実行すると、出力は次のようになります。

Java @継承

説明: 上記の出力のように、状態コードの後に​​「null」値が出力されることがわかります。これは、ステートメント「new Demo ().getClass ()」の戻り値です。 .getAnnotation (MyAnnotation.class)」。これは、@Inherited アノテーションがサブクラスで継承するために MyAnnotation にアノテーションが付けられていないため、デモ クラスはそのスーパークラスから MyAnnotation アノテーションを継承 (またはアノテーション) されていないことを意味します。

結論

Java の @inherited は、別のアノテーションに適用される組み込みアノテーションです。これは、アノテーションが付けられたクラスのサブクラスに継承されるアノテーションをマークするために使用されます。 @inherited は java.lang.annotation.Inherited.

パッケージで使用できます。

以上がJava @継承の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:@Javaでは非推奨次の記事:@Javaでは非推奨