我知道规范确切地定义了它,但无法得到它的原因:
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
我们假设:
new a.X()会从另一个包中加载该类。
导入的类优先于bundle类的原因是什么?它只是java层次类加载策略的后续延续吗?
答案 0 :(得分:5)
这实际上是OSGi的一个核心方面。
整个导入/导出机制旨在让不同的bundle在通信时使用相同的类。在这种情况下,相同不仅意味着二进制相等,而且由相同的类加载器加载(回想一下,每个包都有自己的类加载器)。如果捆绑包自己的类比导入的类更受青睐,则捆绑包将无法“同意”使用哪个类的副本。
为什么你会有一个你打算导入的类的副本?
考虑一种您想要进行日志记录的情况,因此您导入org.osgi.service.log
,但这不是一个重要的方面,您可以愉快地在没有LogService
的情况下运行。现在,
LogService
类,因此您无法使用该服务(这是同意的部分)。在这种情况下,您都导入并包含该类,因此您可以在任何一种情况下运行,在没有其他人拥有时使用您自己的副本,并在其他人的情况下共享副本。您甚至可以选择导出副本,让框架决定。
作为旁注,这正是您(几乎)总是导入您导出的内容的原因。