为什么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
元注释。