Equinox加载Bundle Class的实现_第1页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、equinox加载bundle class的实现,然后执行 createbclprevileg 办法,此办法最后转交由 basedata classloader basedate创建classloader的关键代码片段为: 在equinox中,默认的状况下adaptor.getbundleclassloaderparent返回的为bootsap classloader,可通过修改启动的osgi.parentclassloader 来转变这个parent classloader, osgi.parentclassloader 的可选值有四个,分离是: l boot : l app : syste

2、mclassloader l t : systemclassloader parent l fwk : equinox classloader classloadinghook在createclassloader的时候都没有做动作,因此最后classloader都是通过创建 defaultclassloader对象来构建的,其中parent参数为null,delegate参数为bundleloader实 例,bundleclasspath参数为bundle的classpath。 经过以上步骤后,完成了classloader的创建,可以开头加载class了,按照上面上述,bundle的class

3、就由defaultclassloader来完成了。 查看defaultclassloader的loadclass代码,发觉真正的加载class的过程是转为调用了delegate 的 class来完成的,delegate参数对应的为bundleloader实例,转为跟踪bundleloader的findclass办法。 bundleloader的findclass办法的代码片段: 从以上这个代码片段,可以看到,equinox将java.开始的类转交给了parent classloader去加载,这也意味着没须要在系统中提供对外 java.开始的package。 假如不是java.开始的类,则交由

4、findclassinternal办法来完成加载。 findclassinternal办法遵循的为osgi规范中定义的class的加载挨次,不过仍然稍有改动: 1) 推断是否交由 parent classloader 去完成加载 在启动equinox时,equinox会读取org.osgi.framework.bootdelegation属性,该属性对应配置的为需要 从parent classloader中加载的package,如值配置的为*,解释全部的都从parent classloader中加载 ,如值配置的为详细的package,那么则放入bootdelegation集合;如配置的为带通

5、配符的 package,那么则放入bootdelegationstems集合。 推断时equinox首先推断是否全部的都从parent classloader中加载,如是则从parent classloader中加载; 如需要加载的类的package位于bootdelegation或bootdelegationstems集合中,那么同样从parent classloader中加载。 如不从parent classloader中加载,则进入下面的步骤。 2) equinox classloaderdelegatehook 的扩展来加载 equinox对外提供了classloaderdelegat

6、ehook的接口扩展,可编写classloaderdelegatehook的实现,注册到framework中,那么当有class需要加载等动作时都会得到通知。 在默认状况下,equinox中没有classloaderdelegatehook的实现,因此继续下面的步骤。 3) 推断是否在 import-package 中,如在则交由相应的 packagesource 按照bundle配置的import-package,推断目前需要加载的类是否在import-package中,如在则交由对应的 packagesource举行加载,packagesource在加载时即挺直交由对应的bundle的cl

7、assloader去加载,如加载的类的 package在import-package中,但加载后仍然没有找到class,则挺直抛出classnotfoundexception,如加载 到,则挺直返回。 如所需要加载的类的package不在import-package中,则继续下面的步骤。 4) require-bundle 尝试用法require-bundle来加载,如加载到,则挺直返回,如加载不到,则继续下面的步骤。 5) 尝试从当前 bundle 直到经过以上步骤的尝试,才尝试由当前bundle中加载,当前bundle加载的办法即从bundle-classpath或当前bundle的 fr

8、agment中查找相应名称的class文件,并读取该文件举行加载,如class文件已加载,则举行缓存,再次加载时则不需要查找和解析class 文件。 如从当前bundle中仍然未找到所需的类,则继续下面的步骤。 6) dynamicimport-package 推断需要找的类的package是否在dynamicimport-package中,假如在,则交由相应的packagesource举行加载, 如packagesource中加载不到,则抛出classnotfoundexception;如不在dynamicimport-package中, 则继续下面的步骤。 7) 再次尝试调用 equino

9、x classloaderdelegatehook 的扩展来加载 这步和第2)步相同,因此在默认状况下继续下面的步骤。 8) eclipse buy 机制来加载 buddy机制是eclipse的扩展,并不符合osgi规范,因此在此不做深化分析。 9) 推断一定的条件,如符合则从 parent classloader 推断的条件为:parent classloader不为null、不从parent classloader中加载、equinox的向后兼容属性(patibility.bootdelegation)为true以及 jvm的bug class,如满足以上条件,则尝试从parent classloader中加载。 如经过以上全部步骤后,仍然未找到需要加载的class,则抛出classnotfoundexception。 从上面的代码分析 中,在equinox中可以通过osgi.parentclassloader

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论