Class findClass(String name, boolean checkParent) throws ClassNotFoundException { ClassLoader parentCL = getParentClassLoader(); if (checkParent && parentCL != null && 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 parentCL.loadClass(name); try { if (USE_GLOBAL_DEADLOCK_AVOIDANCE_LOCK) lock(createClassLoader()); return findClassInternal(name, checkParent, parentCL); } finally { if (USE_GLOBAL_DEADLOCK_AVOIDANCE_LOCK) unlock(); } }
private Class findClassInternal(String name, boolean checkParent, ClassLoader parentCL) throws ClassNotFoundException { if (Debug.DEBUG && Debug.DEBUG_LOADER) Debug.println( "BundleLoader[" + this + "].loadBundleClass(" + name + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ String pkgName = getPackageName(name); boolean bootDelegation = false; // follow the OSGi delegation model if (checkParent && parentCL != null && bundle.getFramework().isBootDelegationPackage(pkgName)) // 2) if part of the bootdelegation list then delegate to parent and continue of failure try { return parentCL.loadClass(name); } catch (ClassNotFoundException cnfe) { // we want to continue bootDelegation = true; } Class result = null; try { result = (Class) searchHooks(name, PRE_CLASS); } catch (ClassNotFoundException e) { throw e; } catch (FileNotFoundException e) { // will not happen } if (result != null) return result; // 3) search the imported packages PackageSource source = findImportedSource(pkgName, null); 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, null); 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); if (result != null) return result; // must throw CNFE if dynamic import source does not have the class throw new ClassNotFoundException(name); } } if (result == null) try { result = (Class) searchHooks(name, POST_CLASS); } catch (ClassNotFoundException e) { throw e; } catch (FileNotFoundException e) { // will not happen } // do buddy policy loading if (result == null && policy != null) result = policy.doBuddyClassLoading(name); if (result != null) return result; // hack to support backwards compatibiility for bootdelegation // or last resort; do class context trick to work around VM bugs if (parentCL != null && !bootDelegation && ((checkParent && bundle.getFramework().compatibiltyBootDelegation) || isRequestFromVM())) // we don't need to continue if a CNFE is thrown here. try { return parentCL.loadClass(name); } catch (ClassNotFoundException e) { // we want to generate our own exception below } throw new ClassNotFoundException(name); }