Being a programmer, I would ask you to take a look at this class.
Plugin:
org.eclipse.osgi_3.10.2.v20150203-1939.jar
Class:
BundleLoader
Below 2 methods will give lot of understanding:
Class<?> findClass(String name, boolean checkParent) throws ClassNotFoundException {
  if (checkParent && parent != 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 parent.loadClass(name);
  return findClassInternal(name, checkParent);
 }
private Class<?> findClassInternal(String name, boolean checkParent) throws ClassNotFoundException {
  if (debug.DEBUG_LOADER)
   Debug.println("BundleLoader[" + this + "].findClassInternal(" + name + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  String pkgName = getPackageName(name);
  boolean bootDelegation = false;
  // follow the OSGi delegation model
  if (checkParent && parent != null && container.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
    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) {
   if (debug.DEBUG_LOADER) {
    Debug.println("BundleLoader[" + this + "] loading from import package: " + source); //$NON-NLS-1$ //$NON-NLS-2$
   }
   // 3) found import source terminate search at the source
   result = source.loadClass(name);
   if (result != null)
    return result;
   throw new ClassNotFoundException(name + " cannot be found by " + this); //$NON-NLS-1$
  }
  // 4) search the required bundles
  source = findRequiredSource(pkgName, null);
  if (source != null) {
   if (debug.DEBUG_LOADER) {
    Debug.println("BundleLoader[" + this + "] loading from required bundle package: " + source); //$NON-NLS-1$ //$NON-NLS-2$
   }
   // 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 + " cannot be found by " + this); //$NON-NLS-1$
   }
  }
  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 compatibility for bootdelegation
  // or last resort; do class context trick to work around VM bugs
  if (parent != null && !bootDelegation && ((checkParent && container.getConfiguration().compatibilityBootDelegation) || isRequestFromVM()))
   // we don't need to continue if a CNFE is thrown here.
   try {
    return parent.loadClass(name);
   } catch (ClassNotFoundException e) {
    // we want to generate our own exception below
   }
  throw new ClassNotFoundException(name + " cannot be found by " + this); //$NON-NLS-1$
 }
Resources:
http://moi.vonos.net/java/osgi-classloaders/