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'?
因此,接口上的注释很少有用.
小智 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元注释.
| 归档时间: |
|
| 查看次数: |
59617 次 |
| 最近记录: |