org.codehaus.groovy.tools
Class RootLoader

java.lang.Object
  extended by java.lang.ClassLoader
      extended by java.security.SecureClassLoader
          extended by java.net.URLClassLoader
              extended by org.codehaus.groovy.tools.RootLoader

public class RootLoader
extends URLClassLoader

This ClassLoader should be used as root of class loaders. Any RootLoader does have it's own classpath. When searching for a class or resource this classpath will be used. Parent Classloaders are ignored first. If a class or resource can't be found in the classpath of the RootLoader, then parent is checked.

Note: this is very against the normal behavior of classloaders. Normal is to first check parent and then look in the resources you gave this classloader.

It's possible to add urls to the classpath at runtime through addURL(URL)

Why using RootLoader? If you have to load classes with multiple classloaders and a classloader does know a class which depends on a class only a child of this loader does know, then you won't be able to load the class. To load the class the child is not allowed to redirect it's search for the class to the parent first. That way the child can load the class. If the child does not have all classes to do this, this fails of course.

For example:

       parentLoader   (has classpath: a.jar;c.jar)
           |
           |
       childLoader    (has classpath: a.jar;b.jar;c.jar)
       

class C (from c.jar) extends B (from b.jar)

childLoader.find("C") --> parentLoader does know C.class, try to load it --> to load C.class it has to load B.class --> parentLoader is unable to find B.class in a.jar or c.jar --> NoClassDefFoundException!

if childLoader had tried to load the class by itself, there would be no problem. Changing childLoader to be a RootLoader instance will solve that problem.

Author:
Jochen Theodorou

Constructor Summary
RootLoader(LoaderConfiguration lc)
          constructs a new RootLoader with a @see LoaderConfiguration object which holds the classpath
RootLoader(URL[] urls, ClassLoader parent)
          constructs a new RootLoader with a parent loader and an array of URLs as classpath
 
Method Summary
 void addURL(URL url)
          adds an url to the classpath of this classloader
protected  Class findClass(String name)
           
 URL getResource(String name)
          returns the URL of a resource, or null if it is not found
protected  Class loadClass(String name, boolean resolve)
          loads a class using the name of the class
 
Methods inherited from class java.net.URLClassLoader
definePackage, findResource, findResources, getPermissions, getURLs, newInstance, newInstance
 
Methods inherited from class java.security.SecureClassLoader
defineClass, defineClass
 
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getPackage, getPackages, getParent, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

RootLoader

public RootLoader(URL[] urls,
                  ClassLoader parent)
constructs a new RootLoader with a parent loader and an array of URLs as classpath


RootLoader

public RootLoader(LoaderConfiguration lc)
constructs a new RootLoader with a @see LoaderConfiguration object which holds the classpath

Method Detail

loadClass

protected Class loadClass(String name,
                          boolean resolve)
                   throws ClassNotFoundException
loads a class using the name of the class

Overrides:
loadClass in class ClassLoader
Throws:
ClassNotFoundException

getResource

public URL getResource(String name)
returns the URL of a resource, or null if it is not found

Overrides:
getResource in class ClassLoader

addURL

public void addURL(URL url)
adds an url to the classpath of this classloader

Overrides:
addURL in class URLClassLoader

findClass

protected Class findClass(String name)
                   throws ClassNotFoundException
Overrides:
findClass in class URLClassLoader
Throws:
ClassNotFoundException

Copyright © 2003-2010 The Codehaus. All rights reserved.