为啥导入的类优先于捆绑类?

Posted

技术标签:

【中文标题】为啥导入的类优先于捆绑类?【英文标题】:Why imported classes take precedence over bundle classes?为什么导入的类优先于捆绑类? 【发布时间】:2012-06-21 15:56:15 【问题描述】:

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

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

假设:

    捆绑声明“import-package: a” 此包中有一个本地类 a.X 另一个包中有一个 a.X 类

new a.X() 将从另一个包中加载该类。

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

【问题讨论】:

这允许一个可选的导入修改你的行为。 【参考方案1】:

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

分享课程

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

但是……为什么?

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

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

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

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

【讨论】:

正确。包也被视为一个单元,不能跨类加载器拆分。因此,要么包被导入并完全由导出器提供,要么包在包的内部。 Require-Bundle 是不同的,它确实支持拆分包以解决您别无选择的异常情况。 对,我故意跳过了拆分包,因为问题没有朝那个方向发展。但你是对的,这些是一个特殊的考虑因素。

以上是关于为啥导入的类优先于捆绑类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 类初始化变量不能用于包导入中的类实例对象,但否则?

webpack 可以在不需要或导入的情况下捆绑 js 文件吗? Q2:为啥需要图表?

理解 Yii::import 方法

为啥我不必导入我刚刚制作的类以在我的主类中使用它? (爪哇)

在 Python 中,为啥属性优先于实例属性?

接口能被继承吗?