web-dev-qa-db-ja.com

Javaで@inheritedアノテーションを使用する方法は?

Javaで@Inherited注釈を取得していません。メソッドが自動的に継承される場合、独自の方法でメソッドを実装する必要がある場合はどうでしょうか?

私の実装方法を知る方法は?

さらに、これを使用したくない場合は、昔ながらのJava方法でequals()toString()を実装する必要があります、およびObjectクラスのhashCode()メソッド、およびJava.lang.annotation.Annotationクラスの注釈型メソッド。

何故ですか?

@Inheritedアノテーションと、正常に動作するために使用されるプログラムについて知らなかった場合でも、これらを実装したことはありません。

誰かがこれについて最初から説明してください。

45
StrugglingCoder

誤解がないということだけです: Java.lang.annotation.Inherited について尋ねます。これは、注釈の注釈です。注釈付きクラスのサブクラスは、スーパークラスと同じ注釈を持つと見なされます。

次の2つの注釈を考慮してください。

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotationType {

}

そして

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface UninheritedAnnotationType {

}

このように3つのクラスに注釈が付けられている場合:

@UninheritedAnnotationType
class A {

}

@InheritedAnnotationType
class B extends A {

}

class C extends B {

}

このコードを実行する

System.out.println(new A().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println(new B().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println(new C().getClass().getAnnotation(InheritedAnnotationType.class));
System.out.println("_________________________________");
System.out.println(new A().getClass().getAnnotation(UninheritedAnnotationType.class));
System.out.println(new B().getClass().getAnnotation(UninheritedAnnotationType.class));
System.out.println(new C().getClass().getAnnotation(UninheritedAnnotationType.class));

次のような結果を出力します(注釈のパッケージによって異なります)。

null
@InheritedAnnotationType()
@InheritedAnnotationType()
_________________________________
@UninheritedAnnotationType()
null
null

ご覧のとおり、UninheritedAnnotationTypeは継承されませんが、CInheritedAnnotationTypeから注釈Bを継承します。

どのメソッドがそれと関係があるのか​​分かりません。

91
fabian