为什么java类不从实现的接口继承注释?

2022-08-31 09:10:11

我正在使用依赖注入框架(Guice的AOP来专门拦截一些方法调用)。我的类实现了一个接口,我想对接口方法进行注释,以便框架可以选择正确的方法。即使使用 Inherited annotation 实现类对注释类型进行注释,也不会像 Inherited 的 java 文档中所述继承注释:

另请注意,此元注释仅导致注释从超类继承;已实现接口上的注释不起作用。

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


答案 1

我想说的是,原因是否则会发生多重继承问题。

例:

@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”?


因此,接口上的注释很少有用。


答案 2

来自Javadoc for @Inherited:

指示批注类型自动继承。如果批注类型声明上存在继承的元批注,并且用户在类声明上查询该批注类型,并且该类声明没有针对此类型的批注,则将自动查询类的超类以获取该批注类型。将重复此过程,直到找到此类型的批注,或者到达类层次结构(Object)的顶部。如果没有超类具有此类型的注释,则查询将指示所讨论的类没有此类注释。请注意,如果使用带批注的类型来批注类以外的任何内容,则此元批注类型不起作用。另请注意,此元注释仅导致注释从超类继承;已实现接口上的注释不起作用。

另一方面,JSR 305 验证程序执行某种继承查找。如果您有类的层次结构:

//Person.java
@Nonnull
 public Integer getAge() {...}

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

则 上的有效验证是 。 没有元注释。Student.getAge()@Nonnull @Min(5)@Nonnull@Inherited


推荐