Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between AppClassloader and SystemClassloader

I am so confused about these two class loaders. When talking about the hierarchy of Java class loaders, usually the bootstrap classloader and ext class loader and the third one (system classloader or app classloader) are mentioned.

To be more accurate, I checked the source code of JDK. In class Launcher, there is the code:

loader = AppClassLoader.getAppClassLoader(extcl);

In class ClassLoader, the method:

getSystemClassloader() 

Also says the system classloader is used to start the application.

So which is the third one in the hierarchy, or are the two classloaders the same?

like image 332
QiKuo Zhang Avatar asked Jan 07 '16 08:01

QiKuo Zhang


People also ask

What is AppClassLoader?

The third in the class loader hierarchy is the SystemClassloader. It is also referred as ApplicationClassloader (or AppClassLoader) at some places. This loader loads the our application code and classes found in the classpath.

What is ClassLoader in Java and what are types of ClassLoader in Java?

The Java ClassLoader is a part of the Java Runtime Environment that dynamically loads Java classes into the Java Virtual Machine. The Java run time system does not need to know about files and file systems because of classloaders. Java classes aren't loaded into memory all at once, but when required by an application.

Which ClassLoader loads JAR files from JDK?

The Bootstrap class loader loads the basic runtime classes provided by the JVM, plus any classes from JAR files present in the system extensions directory. It is parent to the System class loader. To add JAR files to the system extensions, directory, see Using the Java Optional Package Mechanism.


1 Answers

Both AppClassLoader and SystemClassLoader are same.

Have a look at hierarchy.

ClassLoader follows three principles.

Delegation principle

ClassLoader hieraechy

Bootstrap ClassLoader is responsible for loading standard JDK class files from rt.jar and it is parent of all class loaders in Java. Bootstrap class loader don't have any parents.

Extension ClassLoader delegates class loading request to its parent, Bootstrap and if unsuccessful, loads class form jre/lib/ext directory or any other directory pointed by java.ext.dirs system property

System or Application class loader and it is responsible for loading application specific classes from CLASSPATH environment variable, -classpath or -cp command line option, Class-Path attribute of Manifest file inside JAR.

Application class loader is a child of Extension ClassLoader and its implemented by sun.misc.Launcher$AppClassLoader class.

Except Bootstrap class loader, which is implemented in native language mostly in C, all Java class loaders are implemented using java.lang.ClassLoader.

Have a look at this blog for better understanding of these three class loaders.

Visibility Principle

According to visibility principle, Child ClassLoader can see class loaded by Parent ClassLoader but vice-versa is not true.

If class Abc is loaded by Application class loader then trying to load class ABC explicitly using Extension ClassLoader will throw java.lang.ClassNotFoundException

Uniqueness Principle

According to this principle a class loaded by Parent should not be loaded by Child ClassLoader again

like image 76
Ravindra babu Avatar answered Sep 24 '22 03:09

Ravindra babu