Equinox加载Bundle Class的实现

发表于:2011-11-25 10:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:building block    来源:51Testing软件测试网采编

分享:

  2)尝试调用Equinox提供的ClassLoaderDelegateHook的扩展来加载

  Equinox对外提供了ClassLoaderDelegateHook的接口扩展,可编写ClassLoaderDelegateHook的实现,注册到Framework中,那么当有Class需要加载等动作时都会得到通知。

  在默认情况下,Equinox中没有ClassLoaderDelegateHook的实现,因此继续下面的步骤。

  3)判断是否在import-package中,如在则交由相应的PackageSource去加载

  根据Bundle配置的import-package,判断目前需要加载的类是否在import-package中,如在则交由对应的PackageSource进行加载,PackageSource在加载时即直接交由对应的Bundle的classloader去加载,如加载的类的package在import-package中,但加载后仍然没有找到Class,则直接抛出ClassNotFoundException,如加载到,则直接返回。

  如所需要加载的类的package不在import-package中,则继续下面的步骤。

  4)尝试从require-bundle中加载

  尝试使用require-bundle来加载,如加载到,则直接返回,如加载不到,则继续下面的步骤。

  5)尝试从当前Bundle中加载

  直到经过以上步骤的尝试,才尝试由当前Bundle中加载,当前Bundle加载的方法即从Bundle-Classpath或当前Bundle的Fragment中查找相应名称的class文件,并读取该文件进行加载,如class文件已加载,则进行缓存,再次加载时则不需要查找和解析class文件。

  如从当前Bundle中仍然未找到所需的类,则继续下面的步骤。

  6)尝试从DynamicImport-Package中加载

  判断需要找的类的package是否在DynamicImport-Package中,如果在,则交由相应的PackageSource进行加载,如PackageSource中加载不到,则抛出ClassNotFoundException;如不在DynamicImport-Package中,则继续下面的步骤。

  7)再次尝试调用Equinox提供的ClassLoaderDelegateHook的扩展来加载

  这步和第2)步相同,因此在默认情况下继续下面的步骤。

  8)尝试使用eclipse的buddy机制来加载

  Buddy机制是Eclipse的扩展,并不符合OSGi规范,因此在此不做深入分析。

  9)判断一定的条件,如符合则从parent classloader中加载

  判断的条件为:parent classloader不为null、不从parent classloader中加载、Equinox的向后兼容属性(osgi.compatibility.bootdelegation)为true以及jvm的bug class,如满足以上条件,则尝试从parent classloader中加载。

  如经过以上所有步骤后,仍然未找到需要加载的class,则抛出ClassNotFoundException。

  从上面的代码分析中,在Equinox中可以通过osgi.parentClassLoader、org.osgi.framework.bootdelegation来控制从Bundle ClassLoader外来加载Class,这对于集成Equinox其他容器而言,非常有用,另外,还可以通过实现ClassLoaderDelegateHook来改变Class的加载。

22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号