本文主要是介绍equinox实现Class Loader机制的代码解读(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
equinox 环境下每一个bundle都是由独立的classLoader实现类的装载的。在OSGi Framework中,Bundle是模块化管理的单元,所有的应用和资源都必须以Bundle作为载体。每个Bundle都有自己的Class Loader,不同Bundle之间(在同一个VM中)可以通过Import和Export机制共享或者隐藏Package。Class Loader建立一种Loading Class的代理模型,来实现资源的共享或隐藏。
下面是equinox实现的类的装载代码:
String pkgName = getPackageName(name);
// follow the OSGi delegation model
if (checkParent && parent != null ) {
if (name.startsWith(JAVA_PACKAGE))
// 1) if startsWith "java." delegate to parent and terminate search
// we want to throw ClassNotFoundExceptions if a java.* class cannot be loaded from the parent.
return parent.loadClass(name);
else if (isBootDelegationPackage(pkgName))
// 2) if part of the bootdelegation list then delegate to parent and continue of failure
try {
return parent.loadClass(name);
} catch (ClassNotFoundException cnfe) {
// we want to continue
}
}
Class result = null ;
// 3) search the imported packages
PackageSource source = findImportedSource(pkgName);
if (source != null ) {
// 3) found import source terminate search at the source
result = source.loadClass(name);
if (result != null )
return result;
throw new ClassNotFoundException(name);
}
// 4) search the required bundles
source = findRequiredSource(pkgName);
if (source != null )
// 4) attempt to load from source but continue on failure
result = source.loadClass(name);
// 5) search the local bundle
if (result == null )
result = findLocalClass(name);
if (result != null )
return result;
// 6) attempt to find a dynamic import source; only do this if a required source was not found
if (source == null ) {
source = findDynamicSource(pkgName);
if (source != null )
result = source.loadClass(name);
}
// do buddy policy loading
if (result == null && policy != null )
result = policy.doBuddyClassLoading(name);
// last resort; do class context trick to work around VM bugs
if (result == null && findParentResource(name))
result = parent.loadClass(name);
if (result == null )
throw new ClassNotFoundException(name);
return result;
}
从上面的代码可以看出什么呢?
1、解释了为什么在equinox的bundle中不需要引入java.*的包,而需要引入javax.*的包。
参见 equinox实现Class Loader机制的代码解读(2)
2、解释了如果import一个包名和当前bundle中的包名相同会发生什么。
参见equinox实现Class Loader机制的代码解读(3)
3、解释了如果使用了动态引入后,再次import相同的包产生的影响。
请参见后面的系列文章。
这篇关于equinox实现Class Loader机制的代码解读(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!