类加载器的分类

160 阅读2分钟

我正在参加「掘金·启航计划」

从jvm角度来看可以分为两种类型的类加载器:

  1. 引导类加载器(Bootstrap ClassLoader):引导类加载器又称启动类加载器是由C语言编写的,非Java层面的类加载器,该类加载器在jvm层面,主要负责加载java核心类库,比如java.lang包,比如String类,也包括ClassLoader系统类加载器。

  2. 是用户自定义类加载器(User Defined ClassLoader):对于jvm定义的用户自定义类加载器来说,只要是ClassLoader派生的类加载器都是用户自定义的类加载器,比如AppClassLoader应用程序类加载器、ExtClassLoader扩展类加载器、以及用户自定义实现的类加载器,jvm统称为用户自定义类加载器。

从程序角度来看分为三种类型的类加载器

  1. 扩展类加载器(Ext ClassLoader):扩展类加载器派生于类加载器ClassLoader,是使用java代码实现的,如下图:

image.png 可以发现ExtClassLoader类加载器是Lanucher类的静态内部类,而Lanucher类又间接继承了ClassLoader类加载器,如下图:

image.png

  1. 应用程序类加载器(App ClassLoader):应用程序类加载器又叫系统类加载器,我们编写的业务代码就是由当前类加载器加载的,系统类加载器又是扩展类加载器的扩展版,可以在源代码里看出,如下图: image.png

可以获取到系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

输出systemClassLoader对象发现是sun.misc.Launcher$AppClassLoader由此可以证明系统类加载器是App ClassLoader类加载器,随便在创建一个classLoadDemo类,我们可以获取该类的类加载器看看我们写的业务代码是否是由系统类加载器加载的

ClassLoader currentClassLoad = classLoadDemo.class.getClassLoader();

最终输出还是sun.misc.Launcher$AppClassLoader,可以发现和获取系统类加载器输出的一样,由此可以证明了我们写的业务代码是有系统类加载器加载的。

  1. 自定义类加载器:顾名思义是由我们程序员自己实现的类加载器也是派生于ClassLoader的,和jvm层面的用户自定义类加载器不同,jvm定义的是包含当前自定义的