如何在Java中使用@inherited注解?

2022-08-31 14:55:44

我没有在Java中获得注释。如果它自动为您继承方法,那么如果我需要以自己的方式实现该方法,那么呢?@Inherited

它将如何了解我的实施方式?

另外,据说如果我不想使用它,而是以老式的Java方式进行,我必须实现类的,和方法以及类的注释类型方法。equals()toString()hashCode()Objectjava.lang.annotation.Annotation

为什么?

我从来没有实现过这些,即使我不知道注释和程序曾经工作正常。@Inherited

请有人从头开始向我解释这一点。


答案 1

只是没有误解:你确实问了java.lang.annotation.inherited。这是批注的批注。这意味着带注释的类的子类被视为与其超类具有相同的注释。

请考虑以下 2 个注释:

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

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

如果三个类的注释如下所示:

@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

如您所见,它不是继承的,而是从 继承注释的。UninheritedAnnotationTypeCInheritedAnnotationTypeB

我不知道有什么方法与此有关。


答案 2

推荐