Java Classloaders: A Deep Dive
Understanding the Basics
Before delving into the complexities, let’s establish a foundation.
- What are Class Loaders? They are essential components of the Java Runtime Environment (JRE) that dynamically load Java classes into the Java Virtual Machine (JVM) during runtime. They abstract the JVM from the underlying file system.
- Delegation Model: This is the core principle governing class loaders. When a class is requested, a class loader first delegates the request to its parent. If the parent cannot find the class, the child loader attempts to load it. This ensures class uniqueness and prevents class conflicts.
- Class Loader Hierarchy: The JVM typically has three built-in class loaders:
- Bootstrap Class Loader: Loads core Java classes from
rt.jar
and other core libraries. - Extension Class Loader: Loads extensions from the
$JAVA_HOME/lib/ext
directory. - System Class Loader: Loads classes from the application’s classpath.
- Bootstrap Class Loader: Loads core Java classes from
Beyond the Basics
Class Loader Lifecycle
- Loading: The class loader finds the class’s binary representation (usually a
.class
file). - Linking: This phase involves:
- Verification: Ensures the class’s bytecode is valid and conforms to JVM specifications.
- Preparation: Allocates memory for static variables and initializes them to default values.
- Resolution: Resolves symbolic references to other classes, interfaces, fields, and methods.
- Initialization: Executes static initializers and constructors.
Custom Class Loaders
- Why Create Custom Class Loaders?
- Isolating code: Different components can have their own class loaders, preventing conflicts.
- Dynamic class loading: Classes can be loaded at runtime based on specific conditions.
- Class reloading: Hot swapping of classes without restarting the application (with limitations).
- Security: Custom class loaders can enforce security policies.
- Creating Custom Class Loaders: Extend the
java.lang.ClassLoader
class and override thefindClass()
method to define your loading logic.