为啥导入的类优先于捆绑类?
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:为啥需要图表?