3

我知道规范准确定义了它,但不知道这是什么原因:

A class space is then all classes reachable from a given bundle’s class loader. 
Thus, a class space for a given bundle can contain classes from:
• The parent class loader (normally java.* packages from the boot class path)
• Imported packages
• Required  bundles
• The bundle's class path (private packages)
• Attached fragments

让我们假设:

  1. 一个包声明“import-package: a”
  2. 此捆绑包中有一个本地类 aX
  3. 在另一个捆绑包中有一个 aX 类

new aX() 将从另一个包中加载该类。

导入类优先于捆绑类的原因是什么?它只是java分层类加载策略的后续延续吗?

4

1 回答 1

5

这实际上是 OSGi 的核心方面。

分享课

整个导入/导出机制旨在让不同的包在通信时使用相同的类。在这种情况下,same 不仅意味着二进制相等,而且由一个类加载器加载(回想一下,每个包都有自己的类加载器)。如果捆绑包自己的类比导入的类更受青睐,捆绑包将无法“同意”使用哪个类的副本。

但为什么?

为什么你会有一个你也打算导入的类的副本?考虑一种情况,您想进行一些日志记录,因此您 import org.osgi.service.log,但这不是一个重要方面,您可以在没有LogService礼物的情况下愉快地运行。现在,

  • 如果您只导入包,您的包将无法解析,因此无法启动,并且
  • 如果您只包含该类,则永远不会使用其他捆绑包的LogService类,因此您不能使用该服务(这是同意的部分)。

在这种情况下,您既可以导入也可以包含该类,因此您可以在任何一种情况下运行,在没有其他人拥有的情况下使用您自己的副本,并在其他人有的情况下共享副本。您甚至可以选择导出您的副本,并让框架来决定。

作为旁注,这正是您应该(几乎)始终导入您导出的内容的原因。

于 2012-06-19T15:30:16.177 回答