繁体   English   中英

Java 在接口中继承注解

[英]Java Inheriting Annotations in Interface

我最近开始研究 Java Web 服务,发现以下令人困惑:

如果我在具有 @Consumes 注释的接口中定义了一个方法,然后我实现了该接口,则该服务可以正常工作,就像继承了 @Consumes 一样。

但是,从阅读各种文章和here来看,注释似乎不是继承的。

我进行了以下测试来检查这一点:

interface ITestAnnotationInheritance {
    @Consumes
    void test();
}

class TestAnnotationInheritanceImpl implements ITestAnnotationInheritance {
    @Override
    //@Consumes     // This doesn't appear to be inherited from interface
    public void test() {}

    public static void main(String[] args) throws SecurityException, NoSuchMethodException {
        System.out.println(TestAnnotationInheritanceImpl.class.getMethod("test").getAnnotation(Consumes.class));
    }
}

结果是:

null

如果我取消注释 TestAnnotationInheritanceImpl 类中的 @Consumes ,则输出为:

@javax.ws.rs.Consumes(value=[*/*])

这证明注解不是继承的,但是web服务怎么能正常工作呢?

非常感谢

假设您正在谈论方法上的 Web 服务注释,那么该框架大概是使用反射来查找超类中声明的方法上的注释......甚至通过继承层次结构寻找在已实现或覆盖的方法上声明的注释相同的签名。 (您可能可以通过查看框架源代码来弄清楚到底发生了什么......)


试试你的例子的这个变体:

class TestAnnotationInheritance {
    @Consumes
    public void test() {}
}

class TestAnnotationInheritance2 extends TestAnnotationInheritance {
    public static void main(String[] args) 
    throws SecurityException, NoSuchMethodException {
        System.out.println(TestAnnotationInheritance2.class.getMethod("test").
                           getAnnotation(Consumes.class));
    }
}

我认为这将表明该方法上存在注释。 (这里的区别在于,我们没有用另一个没有 @Consumes 注释的声明来覆盖具有 @Consumes 注释的方法声明。)


请注意,类上的注释通常不会被继承,但如果它们是用@Inherited注释声明的,它们就会被继承; 请参阅JLS 9.6.3.3javadoc

IMO,注释的继承概念有点橡胶。 但幸运的是,它不会影响核心 Java 类型系统和计算模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM