Part4. OSGi的类加载架构

来源:互联网 发布:程序员和ui设计师爆笑 编辑:程序博客网 时间:2024/05/11 06:05

OSGi的类加载架构并未遵循Java所推荐的双亲委派模型,他的类加载器通过严谨定义的规则从Bundle的一个子集中加载类。除了Fragment Bundle外,每一个被正确解析的Bundle都有一个独立的类加载器支持,这些类加载器之间相互协作形成了一个类加载的代理网络架构,因此OSGi采用的是网状的类加载架构,而不是Java传统的树状类加载架构。

 在OSGi中,类加载器可以划分为3类。

一、父类加载器:有Java平台直接提供,最典型的场景包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)、和应用程序类加载器(Application ClassLoader)。他们用于加载以 “java.*” 开头的类以及在父类委派清单中声明为要委派给父类加载器加载的类。

二、Bundle类加载器:每个bundle都有自己独立的类加载器,用于加载本bundle中的类和资源。当一个bundle去请求加载另一个bundle导出的package中的类时,要把加载请求委派给导出类的那个bundle的加载器处理,而无法自己去加载其他bundle的类。

Bundle-Classpath这个元数据标记与Bundle类加载器密切相关,它描述了Bundle加载器的Classpath范围,即bundle加载器应该在哪里去查找类。

Bundle-Classpath标记有默认值“ . ”,它代表该bundle的跟目录,或者说代表该bundle的JAR文件。如果不在元数据信息中显示定义这个标记,那么bundle类加载器就在整个bundle的范围内查找类。但是要注意,在这种默认配置下,如果bundle存在其他JAR文件,类加载器只能把它当做一个普通的资源来读取,而无法查找这些JAR文件内部包含的类。

Bundle类加载器收到类加载请求时,会优先委托给导入包的其他bundle类加载器处理,只有其他导入包的bundle类加载器都无法处理时才会尝试自己处理。(通俗的理解为“Import-Package” 和 “Require-Bundle” 的优先级高于 “Bundle-Classpath”)

三、其他加载器:譬如线程上下文类加载器、框架类加载器等。他们并非OSGi规范中专门定义的,但是为了实现方便,在许多OSGi框架中都会使用。


类加载顺序:




0 0
原创粉丝点击