equinox实现Class Loader机制

equinox实现Class Loader机制

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


equinox实现Class Loader机制_第1张图片


equinox实现Class Loader机制_第2张图片


下面是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;

    }

你可能感兴趣的:(equinox实现Class Loader机制)