2.类加载器分类

JVM支持两种类型的类加载器,分别是引导类加载器Bootstrap ClassLoader和自定义类加载器User-Defined ClassLoader。

从概念上来讲,自定义类加载器一般指的是程序中开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。

无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如图:

2.类加载器分类

用户自定义类使用的是系统类加载器进行加载

java的核心类库都是使用引导类加载器进行加载的,例如String类

通过getClassLoader()方法不能获取到引导类加载器获取结果为null,引导类加载器是c/c++语言实现的。

2.1启动类加载器

启动类加载器(引导类加载器Bootstrap ClassLoader)

1.这个类加载器使用c/c++语言实现的,嵌套在JVM内部
2.它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类
3.并不继承自java.lang.ClassLoader,没有父加载器。
4.加载扩展类和应用程序类加载器,并指定为他们的父类加载器。
5.处于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

2.2扩展类加载器

扩展类加载器(Extension ClassLoader)

1.Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
2.派生于ClassLoader类
3.父类加载器为启动类加载器
4.从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

2.3应用程序加载器

应用程序加载器(系统类加载器AppClassLoader)

1.java语言编写,由sun.misc.Launcher$AppClassLoader实现
2.派生于ClassLoader类
3.父类加载器为扩展类加载器
4.它负责加载环境变量classpath或系统属性java.class.path指定路径下的类库
5.该类加载是程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载
6.通过ClassLader#getSystemClassLoader()方法可以获取到该类加载器

2.4用户自定义类加载器

用户自定义类加载器(后续章节详细概述,此处先了解)

在java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。

为什仫要自定义类加载器?

隔离加载类
修改类加载的方式
扩展加载源
防止源码泄露

用户自定义类加载器实现步骤:

1.开发人员可以通过继承抽象类java.lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。
2.在JDK1.2之前,在自定义类加载器时,总会去继承ClassLoader类并重写loadClass()方法,从而实现自定义的类加载类,但是在JDK1.2之后已不再建议用户去覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findClass()方法中。
3.在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,这样就可以避免自己去编写findClass()方法及其获取字节码流的方式,使自定义类加载器编写更加简洁。

相关文章:

  • 2021-12-18
  • 2021-12-19
  • 2021-05-08
  • 2022-01-22
  • 2022-12-23
  • 2021-08-11
  • 2021-07-16
  • 2021-09-22
猜你喜欢
  • 2021-09-08
  • 2021-12-23
  • 2021-08-21
  • 2022-12-23
  • 2021-04-02
  • 2021-12-06
相关资源
相似解决方案