equinox环境下每一个bundle都是由独立的classLoader实现类的装载的。在OSGi Framework中,Bundle是模块化管理的单元,所有的应用和资源都必须以Bundle作为载体。每个Bundle都有自己的Class Loader,不同Bundle之间(在同一个VM中)可以通过Import和Export机制共享或者隐藏Package。Class Loader建立一种Loading Class的代理模型,来实现资源的共享或隐藏。
下面是equinox实现的类的装载代码:
ClassfindClass(Stringname,booleancheckParent)throwsClassNotFoundException{
StringpkgName=getPackageName(name);
//followtheOSGidelegationmodel
if(checkParent&&parent!=null){
if(name.startsWith(JAVA_PACKAGE))
//1)ifstartsWith"java."delegatetoparentandterminatesearch
//wewanttothrowClassNotFoundExceptionsifajava.*classcannotbeloadedfromtheparent.
returnparent.loadClass(name);
elseif(isBootDelegationPackage(pkgName))
//2)ifpartofthebootdelegationlistthendelegatetoparentandcontinueoffailure
try{
returnparent.loadClass(name);
}catch(ClassNotFoundExceptioncnfe){
//wewanttocontinue
}
}
Classresult=null;
//3)searchtheimportedpackages
PackageSourcesource=findImportedSource(pkgName);
if(source!=null){
//3)foundimportsourceterminatesearchatthesource
result=source.loadClass(name);
if(result!=null)
returnresult;
thrownewClassNotFoundException(name);
}
//4)searchtherequiredbundles
source=findRequiredSource(pkgName);
if(source!=null)
//4)attempttoloadfromsourcebutcontinueonfailure
result=source.loadClass(name);
//5)searchthelocalbundle
if(result==null)
result=findLocalClass(name);
if(result!=null)
returnresult;
//6)attempttofindadynamicimportsource;onlydothisifarequiredsourcewasnotfound
if(source==null){
source=findDynamicSource(pkgName);
if(source!=null)
result=source.loadClass(name);
}
//dobuddypolicyloading
if(result==null&&policy!=null)
result=policy.doBuddyClassLoading(name);
//lastresort;doclasscontexttricktoworkaroundVMbugs
if(result==null&&findParentResource(name))
result=parent.loadClass(name);
if(result==null)
thrownewClassNotFoundException(name);
returnresult;
}
从上面的代码可以看出什么呢?
1、解释了为什么在equinox的bundle中不需要引入java.*的包,而需要引入javax.*的包。
参见 equinox实现Class Loader机制的代码解读(2)
2、解释了如果import一个包名和当前bundle中的包名相同会发生什么。
参见equinox实现Class Loader机制的代码解读(3)
3、解释了如果使用了动态引入后,再次import相同的包产生的影响。
请参见后面的系列文章。
分享到:
相关推荐
深入理解OSGi:Equinox原理、应用与最佳实践源代码,同时附带equinox-SDK-3.8源代码。
第一部分主要介绍了OSGi和Equinox,以及OSGi标准的Eclipse实现;第二部分采用非正式教程的方式教给读者如何从零开始构建真实的Toast应用,针对每一个步骤都提供了完整的在线示例代码;第三部分由原型构建转向实际的...
equinox
NULL 博文链接:https://salever.iteye.com/blog/712772
Equinox是OSGI R4的一个实现,Equinox这个项目是由Eclipse 开源组织实现并发布的,也是大名鼎鼎的Java开发工具 Eclipse 的底层机制的实现,如果对Eclipse有点熟悉的话,你就知道Equinox 这个东西是多么的棒了,...
我实现的《使用Equinox开发OSGI应用程序》全部功能的代码和分发包,工程师基于Eclipse3.3的
equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip equinox-SDK-3.7.zip
eclipse de osgi框架 equinox-SDK-3.6.1.part1
osgi官网下的地址:https://download.eclipse.org/equinox/drops/S-4.22M1-202109291800/index.php
osgi的规范实现equinox 基于eclipse版本Oxygen的实现库,官网下载实在太慢,小水管下好后,方便大家下载!
全面解读OSGi规范,深刻揭示OSGi原理,详细讲解OSGi服务,系统地介绍Equinox框架的用法,并通过源代码分析其工作机制,包含大量可操作性极强的解决方案和最佳实践。
本文将介绍 Equinox 的 ServletBridge 项目,提供一个示例来说明如何使用 ServletBridge,并将简要分析 它的实现方法。 读者将首先了解到如何在 Servlet Container 中嵌入 OSGI,并从文章提供的例子中了了解其工作...
Equinox p2详细图示讲解, RCP中如何实现版本检测,更新
Equinox
OSGi and Equinox, Creating Highly Modular Java Systems
OSGI标准实现框架equinox的SDK,版本是3.8.2.里面包含equinox的所有插件jar包,适合做OSGI的开发。
equinox-SDK-4.18.zip
equinox-all-1.7。Appfuse的缩小版。
org.eclipse.equinox.executable org.eclipse.equinox.launcher org.eclipse.osgi org.eclipse.osgi.tests 另加几篇分析的文章