我正在使用一个依赖注入框架(Guice的AOP专门用来拦截一些方法调用)。我的类实现了一个接口,我想对接口方法进行注释,这样框架就可以选择正确的方法。即使注释类型是用Inherited注释来注释的,实现类也不会像继承的java文档中所说的那样继承注释:
还要注意,这个元注释只会导致从超类继承注释;实现的接口上的注释没有任何效果。
这可能是什么原因呢?了解对象的类在运行时实现的所有接口并不是那么困难的事情,所以这个决定背后一定有很好的理由。
发布于 2011-01-20 18:14:58
我要说的原因是,否则将会出现多重继承问题。
示例:
@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'?
因此,接口上的注释很少有用。
发布于 2013-02-02 03:16:12
从@Inherited的Javadoc:
表示注释类型被自动继承。如果在批注类型声明中存在继承的元批注,并且用户在类声明上查询批注类型,而类声明中没有该类型的批注,则将自动查询类的超类中的批注类型。将重复此过程,直到找到此类型的注释,或到达类层次结构(对象)的顶部。如果没有超类具有此类型的注释,则查询将指示相关类没有此类注释。请注意,如果带注释的类型用于注释类以外的任何内容,则此元注释类型不起作用。还要注意的是,这个元注释只会导致从超类继承注释;实现的接口上的注释没有任何影响。
另一方面,JSR305验证器执行某种继承查找。如果你有一个类的层次结构:
//Person.java
@Nonnull
public Integer getAge() {...}
//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}
那么在Student.getAge()
上有效的验证就是@Nonnull @Min(5)
。@Nonnull
没有@Inherited
元注释。
https://stackoverflow.com/questions/4745798
复制相似问题