gembin

OSGi JSF Eclipse RCP

 

equinox实现Class Loader机制

equinox 环 境下每一个bundle都是由独立的classLoader实现类的装载的。在OSGi Framework中,Bundle是模块化管理的单元,所有的应用和资源都必须以Bundle作为载体。每个Bundle都有自己的Class Loader,不同Bundle之间(在同一个VM中)可以通过Import和Export机制共享或者隐藏Package。Class Loader建立一种Loading Class的代理模型,来实现资源的共享或隐藏。




下面是equinox实现的类的装载代码:


 



    Class findClass(String name, boolean checkParent) throws ClassNotFoundException {



        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;

    }

posted on 2008-05-05 10:24 gembin 阅读(71) 评论(0)  编辑  收藏 所属分类: OSGi


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 
相关链接:
网站导航:




导航

统计

常用链接

留言簿(2)

随笔分类(221)

随笔档案(211)

文章档案(1)

新闻档案(1)

相册

收藏夹(1)

Favorite Links

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行