Skip to main content

Explain the Class Loader Mechanism of JVM?. How to write a custom Class Loader Class?

Every java program has at least three class loaders.

- The bootstrap class loader
- The extension class loader.
- The system class loader.

The bootstrap class loader loads the system classes from the JAR Fle rt.jar(part of JRE System Library) . It is an integral part of the virtual machine and is usually implemented in C. There is no Class loader object corresponding to the bootstrap class loader. For example.

String.class.getClassLoader() will return null since String class is loader by bootstrap loader.

The extension class loaders loads "standard extensions "from the jre/lib/ext directory.

The system class loader loads the application classes. It locates the classes in the directories and JAR/ZIP files on the class path.

The System class loader also called application class loader.

In Sun's java implementation , the extension adn system class loaders are implemented in java. Both are instances of URLClass loader.

You can just go through the source code of URLClass Loader and ClassLoader classes to understand more about the loading process.

protected synchronized Class loadClass(String name, boolean resolve)throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}

This is the implementation of loadClass method in ClassLoader class.

- Whenever a call to this method, it will check whether this class is already loaded by calling 'findLoadedClass()' method>

- If the class is not already loaded and if there is a parent class loader , it will ask the parent to load the class.

- If the parent class is not available, it will ask the BootStrapClass loader to load the class.

- If both condtions are not satisfied and an ClassNotFoundException occurs , it will call a method to find and load the class.

Now we come to create a custom Class Loader.

To implement this we have the following process>

- A Class should extend the abstract class ClassLoader and override the method loadClass.

- As i said before we can write the code similar to the original loadClass method.

- Here there is another method called 'defineClass()' whose signature is

"defineClass(String name, byte[] b, int off, int len)"

This method is used whenever we have the class name and byte array of the class file. This is a native method means not written in java. It will return class object after loading the class.


Comments

  1. nice writeup. for more details and eclipse options for class loading, see my complimentary article on class loading in java

    ReplyDelete

Post a Comment

Popular posts from this blog

Initializing fields to 0-false-null is redundant

One of the most fundamental aspects of a programming language is how it initializes data. For Java, this is defined explicitly in the language . For fields and array components , when items are created, they are automatically set to the following default values by the system: numbers: 0 or 0.0 booleans: false object references: null This means that explicitly setting fields to 0, false, or null (as the case may be) is unnecessary and redundant. Since this language feature was included in order to, in part, reduce repetitive coding, it's a good idea to take full advantage of it. Insisting that fields should be explicitly initialized to 0, false, or null is an idiom which is likely inappropriate to the Java programming language. _______________________________________________

One good Question about Garbage Collection

Class CardBoard {        Short story = 200;        CardBoard go(CardBoard cb){             cb = null;             return cb;        }        public static void main(String args[]){             CardBoard c1 = new CardBoard();             CardBoard c2 = new CardBoard();             CardBoard c3 = c1.go(c2);             c1 = null; // (1)            // some code        } } After executing line (1) how many objects are eligible for garbage collection ? First we can go through the code, - We are creating two objects and they are referred by reference variables c1 and c2.- During the execution of thisline CardBoard c3 = c1.go(c2); no new objects are created in the heap. - The...