Java 方法注释如何与方法重写结合使用?

2022-08-31 13:10:48

我有一个父类和一个子类,定义如下:ParentChild

class Parent {
    @MyAnnotation("hello")
    void foo() {
        // implementation irrelevant
    }
}
class Child extends Parent {
    @Override
    foo() {
        // implementation irrelevant
    }
}

如果我得到一个参考,会给我?还是会是?MethodChild::foochildFoo.getAnnotation(MyAnnotation.class)@MyAnnotationnull

我对注释如何或是否与Java继承一起工作更感兴趣。


答案 1

逐字复制自 http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html#annotation-inheritance

注释继承

了解与注释继承相关的规则非常重要,因为这些规则与基于注释是否存在的连接点匹配有关。

默认情况下,不继承批注。给定以下程序

        @MyAnnotation
        class Super {
          @Oneway public void foo() {}
        }

        class Sub extends Super {
          public void foo() {}
        }

然后没有注释,并且不是一个方法,尽管它覆盖了哪个是。SubMyAnnotationSub.foo()@OnewaySuper.foo()

如果注释类型具有元注释,则类上该类型的注释将导致子类继承该注释。因此,在上面的示例中,如果类型具有该属性,则将具有注释。@InheritedMyAnnotation@InheritedSubMyAnnotation

@Inherited当用于批注类型以外的任何内容时,批注不会被继承。实现一个或多个接口的类型永远不会从它实现的接口继承任何批注。


答案 2

您已经找到了答案:JDK 中没有提供方法注释继承。

但是,攀登超类链以寻找带注释的方法也很容易实现:

/**
 * Climbs the super-class chain to find the first method with the given signature which is
 * annotated with the given annotation.
 *
 * @return A method of the requested signature, applicable to all instances of the given
 *         class, and annotated with the required annotation
 * @throws NoSuchMethodException If no method was found that matches this description
 */
public Method getAnnotatedMethod(Class<? extends Annotation> annotation,
                                 Class c, String methodName, Class... parameterTypes)
        throws NoSuchMethodException {

    Method method = c.getMethod(methodName, parameterTypes);
    if (method.isAnnotationPresent(annotation)) {
        return method;
    }

    return getAnnotatedMethod(annotation, c.getSuperclass(), methodName, parameterTypes);
}

推荐