为什么java类不会从已实现的接口inheritance注释?

我一直在使用Guice的AOP来拦截一些方法调用。 我的类实现了一个接口,我想注释接口方法,所以Guice可以select正确的方法。 即使注释types使用了inheritance注释,实现类也不inheritanceinheritance的java文档中所述的注释:

还要注意,这个元注释只会导致注释从超类inheritance; 已实现的接口上的注释不起作用。

这可能是什么原因? 了解一个对象的类在运行时所实现的所有接口并不是那么难,因此这个决定背后必须有一个很好的理由。

我想说的原因是,否则会出现多重inheritance问题。

例:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo{ @Baz("baz") void doStuff(); } public interface Bar{ @Baz("phleem") void doStuff(); } public class Flipp{ @Baz("flopp") public void doStuff(){} } public class MyClass extends Flipp implements Foo, Bar{} 

如果我这样做:

 MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() 

结果是什么? 'baz','phleem'或'flopp'?


出于这个原因,接口上的注释很less有用。

来自@Inherited的Javadoc :

指示注释types是自动inheritance的。 如果注解types声明中存在inheritance的元注释,并且用户在类声明中查询注释types,并且类声明没有该types的注释,则会自动查询该类的父类的注解types。 这个过程将被重复,直到find这个types的注释,或者到达类层次(Object)的顶部。 如果没有超类具有这种types的注释,那么查询将指示所讨论的类没有这样的注释。 请注意,如果注释types用于注释除类之外的任何内容,则此元注释types不起作用。 还要注意,这个元注释只会导致注释从超类inheritance; 已实现的接口上的注释不起作用。

另一方面,JSR 305validation器进行某种inheritance查找。 如果你有一个类的层次结构:

 //Person.java @Nonnull public Integer getAge() {...} //Student.java (inherits from Person) @Min(5) public Integer getAge() {...} 

那么对Student.getAge()的有效validation是@Nonnull @Min(5)@Nonnull没有@Inherited元注释。