In a JVM, each class is loaded by some instance of a
ClassLoader class is located in the
java.lang package and developers are free to subclass it to add their own functionality to class loading.
Whenever a new JVM is started by typing
java MyMainClass, the "bootstrap class loader" is responsible for loading key Java classes like
java.lang.Object and other runtime code into memory first. The runtime classes are packaged inside of the JRE\lib\rt.jar file. We cannot find the details of the bootstrap class loader in the Java documentation, since this is a native implementation. For the same reason, the behavior of the bootstrap class loader will also differ across JVMs.
In a related note, we will get
null if we try to get the class loader of a core Java runtime class, like this:
Next comes the Java extension class loader. We can store extension libraries, those that provide features that go beyond the core Java runtime code, in the path given by the
java.ext.dirs property. The
ExtClassLoader is responsible for loading all .jar files kept in the
java.ext.dirs path. A developer can add his or her own application .jar files or whatever libraries he or she might need to add to the classpath to this extension directory so that they will be loaded by the extension class loader.
The third and most important class loader from the developer perspective is the
AppClassLoader. The application class loader is responsible for loading all of the classes kept in the path corresponding to the
java.class.path system property.
"Understanding Extension Class Loading" in Sun's Java tutorial explains more on the above three class loader paths. Listed below are a few other class loaders in the JDK:
java.lang.Thread, contains the method
public ClassLoader getContextClassLoader(), which returns the context class loader for a particular thread. The context class loader is provided by the creator of the thread for use by code running in this thread when loading classes and resources. If it is not set, the default is the class loader context of the parent thread. The context class loader of the primordial thread is typically set to the class loader used to load the application.