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

Bor*_*vić 105 java inheritance annotations interface guice

我一直在使用Guice的AOP来拦截一些方法调用.我的类实现了一个接口,我想注释接口方法,以便Guice可以选择正确的方法.即使注释类型使用Inherited annotation注释,实现类也不会继承Inherited的java doc中所述的注释:

另请注意,此元注释仅导致注释从超类继承; 已实现接口上的注释无效.

这可能是什么原因?了解对象类在运行时实现的所有接口并不是一件难事,因此必须有充分的理由支持这一决策.

Sea*_*oyd 127

我会说原因是否则会发生多重继承问题.

例:

@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{}
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()
Run Code Online (Sandbox Code Playgroud)

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


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

  • 接口上的注释仅在您拥有支持它们的框架时才有用.在这个例子中BTW getAnnotation()返回null;) (9认同)
  • @Slanec看看Spring的来源,看看Spring们如何解决这些问题.请参阅[AnnotationUtils.findAnnotation(method,annotationType)](http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-core/3.1.1.RELEASE/org/springframework/core/注解/ AnnotationUtils.java#AnnotationUtils.findAnnotation%28java.lang.reflect.Method%2Cjava.lang.Class%29) (7认同)
  • 人,我不知道.在这种情况下(如果拼写错误不在那里),我希望"字段值是模糊的.-类似编译器错误,就像两个接口声明具有不同值的相同常量一样.我知道这是_not_一个字段,但是注释值在编译时得到解决,不是吗?我们在这里缺少的功能在很多情况下会非常有用.顺便说一下,回复旧帖子很抱歉:). (6认同)
  • @WChargin是的,有人花了两年的时间来发现这个错字:-) (2认同)

小智 35

来自@Inherited 的Javadoc:

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

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

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

//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}
Run Code Online (Sandbox Code Playgroud)

然后在有效的验证Student.getAge()@Nonnull @Min(5).@Nonnull没有@Inherited元注释.

  • 这个应该是选定的答案 (4认同)
  • 你的例子与你的答案相矛盾,它说`@ Inherited`对除了class之外的任何东西都没有影响 (3认同)
  • @Inherited 仅当您在 Class 上使用注释时才起作用 (2认同)