Search code examples
javaclassloader

Stock JDK classes and the "null" ClassLoader?


I am trying to debug a very strange class error by looking at the ClassLoaders for some dynamically created components. ClassLoaders are something I've never played much with - and im surprised that standard JDK classes have null Class loader instances.

Can somebody explain the output of this simple main method in terms of the classes whose loaders I am attempting to print, and also more generally:

  1. the way ClassLoaders work on the JVM and
  2. how we can debug missing classes using ClassLoaders.
public class MyClass {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        System.out.println(relfect.MyClass.class.getClassLoader());
        System.out.println(String.class.getClassLoader());
        System.out.println(ArrayList.class.getClassLoader());
        System.out.println(JButton.class.getClassLoader());
        System.out.println(System.class.getClassLoader());

        Boolean b = new Boolean(true);
        System.out.println(b.getClass().getClassLoader());
        
    }

}

Output

sun.misc.Launcher$AppClassLoader@1f7182c1
null
null
null
null
null

Solution

  • The javadoc for getClassLoader() says

    Returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader.

    So, that at least explains why you get that result. But it does not explain why the implementors decided to do it that way.

    EDIT: After testing adding my own classes to the bootclasspath then they also show up as null class loader.