Java方法注释如何与方法重写一起使用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

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

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

如果我获得一个Method参考Child::foochildFoo.getAnnotation(MyAnnotation.class)会给我@MyAnnotation吗?还是会呢null

我更关心的是更多地关注注释如何或者注解是否适用于Java继承。

提问于
用户回答回答于

您已经找到了答案:在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);
}
用户回答回答于

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() {}
        }

然后Sub没有MyAnnotation注释,并且Sub.foo()不是一种@Oneway方法,尽管它覆盖了Super.foo()它。 如果注释类型具有元注释,@Inherited则该类上的注释将导致注释被子类继承。所以,在上面的例子中,如果该MyAnnotation类型具有该@Inherited属性,那么Sub将具有该MyAnnotation注释。 @Inherited用于注释除类型以外的任何内容时,注释不会被继承。实现一个或多个接口的类型永远不会从它实现的接口继承任何注释。

扫码关注云+社区