Click here to Skip to main content
15,036,441 members
Articles / Programming Languages / Java
Article
Posted 20 Jan 2011

Tagged as

Stats

26.8K views
129 downloads
3 bookmarked

Adding class paths to SystemClassLoader

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
23 Jan 2011CPOL
How to add 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:

Java
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.

Image 1

History

  • 2010.01.20: First draft.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Sam NG
Hong Kong Hong Kong
No Biography provided

Comments and Discussions

 
GeneralInteresting, but well known and not recommended hack Pin
Alexandre Nikolov20-Jan-11 22:19
MemberAlexandre Nikolov20-Jan-11 22:19 
GeneralRe: Interesting, but well known and not recommended hack Pin
Sam NG23-Jan-11 16:50
MemberSam NG23-Jan-11 16:50 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.