Adding class paths to SystemClassLoader
Introduction
This article is a non-recommended hack for dynamically adding a class path to SystemClassLoader. You should re-think your design before using this hack; usually, you should be able to use URLClassLoader to load whatever you want.
About SystemClassLoader
SystemClassLoaders are usually URLClassLoaders, and in URLClassLoader, there is a method called addURL(), so we can make use of this to add paths/jars to SystemClassLoader dynamically at runtime. However, since "addURL()" is a protected method, we have to use Reflection to call it.
The sample code is as follows:
public static void addURLs(URL[] urls) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
if ( cl instanceof URLClassLoader ) {
URLClassLoader ul = (URLClassLoader)cl;
// addURL is a protected method, but we can use reflection to call it
Class<?>[] paraTypes = new Class[1];
paraTypes[0] = URL.class;
Method method = URLClassLoader.class.getDeclaredMethod("addURL", paraTypes);
// change access to true, otherwise, it will throw exception
method.setAccessible(true);
Object[] args = new Object[1];
for(int i=0; i<urls.length; i++) {
args[0] = urls[i];
method.invoke(ul, args);
}
} else {
// SystemClassLoader is not URLClassLoader....
}
}
Test
I have written a test case, and it will automatically load all "lib/*.jar" and instantiate an object as specified in args[0]. The test output is as follows. Note: I only included "bin" as my class path, and I have commons-collections.jar under my "lib" directory, but the program is still able to dynamically load the required class.

History
- 2010.01.20: First draft.
Post Comment
8FFvYo wow, awesome blog post.Much thanks again. Will read on...