Java 为什么不';OSGi声明性服务(DS)注释继承自超类?

Java 为什么不';OSGi声明性服务(DS)注释继承自超类?,java,inheritance,osgi,declarative,Java,Inheritance,Osgi,Declarative,OSGi声明性服务(DS)规范定义了可由工具(如Bnd)处理到运行时使用的组件描述xml中的注释。R6规范中的112.8.1规定: 组件注释不是继承的,它们只能在给定的类上使用,其超类层次结构或接口上的注释不被考虑。 为什么它们被指定为不允许继承?Apache Felix项目提供的DS注释曾经支持DS扩展性。基于此实现,我们尝试将其标准化,作为指定官方OSGi DS注释工作的一部分 但问题是,我们在这里遇到了两个实现类之间跨越捆绑包边界的严重耦合问题,我们无法使用Import-Package或

OSGi声明性服务(DS)规范定义了可由工具(如Bnd)处理到运行时使用的组件描述xml中的注释。R6规范中的112.8.1规定:

组件注释不是继承的,它们只能在给定的类上使用,其超类层次结构或接口上的注释不被考虑。


为什么它们被指定为不允许继承?

Apache Felix项目提供的DS注释曾经支持DS扩展性。基于此实现,我们尝试将其标准化,作为指定官方OSGi DS注释工作的一部分

但问题是,我们在这里遇到了两个实现类之间跨越捆绑包边界的严重耦合问题,我们无法使用
Import-Package
Require-Capability
头正确表达这种依赖关系

我突然想到一些问题:

  • 通常,您希望将
    bind
    unbind
    方法设置为私有。DS调用基类上的私有
    bind
    unbind
    方法可以吗?(从技术上讲,这是可以做到的,但从概念上来说,这行吗?)
  • 如果我们有私有方法,但实现者决定更改私有方法的名称怎么办?毕竟,它们是私有的,不是API表面的一部分。扩展程序将失败,因为
    bind
    /
    unbind
    方法列在扩展类和提供的描述符中,并且它们仍然命名旧方法名称
  • 如果我们不支持私有方法名称,我们将要求这些
    bind
    /
    unbind
    方法被保护或公开。因此,我们强制实现细节方法成为API的一部分。不是很好
  • 注意:包私有方法不起作用,因为两个不同的包不应共享具有不同内容的相同包

我们当时认为,在一个包中拥有这样的继承是可以的,但得出的结论是,这种限制、围绕它的解释等都不值得付出努力。因此,我们再次从规范路线图中删除了该功能。

“因此,我们强制实现细节方法成为API的一部分。这不是很好的IMHO。”。在我们的组件模型中(90%类似于DS),只有bind和setter方法可以是公共的。由于组件类通常不在导出的包中,因此这些函数不会成为任何API的一部分。在我看来,调用method.setAccessible(true)比强制人们使用公共绑定方法要糟糕得多。但是组件类可以用作服务对象,因此这些公共绑定/取消绑定方法都在共享服务对象上。