JVM中的三种类加载器

JVM中的三种类加载器

启动类加载器,拓展类加载器,应用类加载器

咱们的类经过javac编译后,生成.class文件保存下来,然后经过类加载器加载类至内存,生成java.lang.Class类的实例,这个实例就是程序访问这个类的入口,通过这个class实例的newInstance方法即可得到这个类的实例对象。

启动类加载器(Bootstrap classLoader):又称为引导类加载器,由C++编写,无法通过程序得到。主要负责加载JAVA中的 一些核心类库,主要是位于<JAVA_HOME>/lib/rt.jar中。

拓展类加载器(Extension classLoader):主要加载JAVA中的一些拓展类,位于<JAVA_HOME>/lib/ext中,是启动类加载器的子类。

应用类加载器(System classLoader): 又称为系统类加载器,主要用于加载CLASSPATH路径下我们自己写的类,是拓展类加载器子类。

比如我们自己写了一个类Student类,经过编译后会得到Student.class文件,然后经过类加载器得到Class实例,例如通过
Class.forName(“com.***.Student”),通过全路径加载进来。然后我们用Student.class.getClassLoader()得到它的类加载器,得到的是AppClassLoader(即系统类加载器),如果用Student.class.getClassLoader().getParent()得到的是它的父加载器ExtClassLoader(即拓展类加载器),然后用Student.class.getClassLoader().getParent().getParent()得到将会是Null,因为启动类加载器是用C++写的,我们无法通过程序直接得到.

常见问题:
1.Object类是由哪个类加载器加载的?
BootStrap ClassLoader
2.我们自己写的类是由哪个类加载器加载的?
System ClassLoader
3.类加载器都是我们Java中的一个类ClassLoader的子类吗? BootStrapClassLoader不是的,另外两个是的。

     类加载器的三大特性:委托性、可见性、单一性
     
     委托性:每个类中都有一个自己的类加载器的属性,这也就是为什么可以通过Student.class.getClassLoader()来    获取自己的类加载器。当一个类加载器要加载一个类时,它会先委托自己的父类加载器来加载,只有当父加载器无法加载类时,才会自己去加载。
     
     例如我们写了一个类Student,它的类加载器是System ClassLoader,它首先会委托给它的父加载器即Extension ClassLoader,然后Extension ClassLoader又会委托给它的父加载器BootStrap ClassLoader,启动类加载器无法加载这个类,交给拓展类加载器,拓展类加载器也无法加载,然后才轮到系统类加载器进行加载。
     
     可见性:可见性指的是父加载器无法利用子加载器加载的类,而子加载器可以利用父加载器加载的类。
     
     单一性:一个类只会被一个类加载器加载一次,不会被重复加载。我们自己也可以写自己的类加载器以满足自己特定的要求,只要实现ClassLoader这个类即可,但是要满足上面所说的类加载器的三种特性。
    原文作者:爱学习的老吴
    原文地址: https://blog.csdn.net/wu756271909/article/details/105511049
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞