当谈论Java虚拟机(JVM)的类装载器时,我们指的是JVM内部的一种机制,负责在运行时加载Java类文件到内存中,并生成对应的Java类对象。类装载器在Java程序运行过程中起到了重要作用,它不仅负责加载应用程序的类,还负责加载JVM自身需要的类和库。

类装载器(Class Loader)

类装载器的主要职责是动态加载Java类到JVM中,并在需要时解析这些类的字节码。它们通常按照层级关系组织,每个类装载器负责加载特定位置或者特定来源的类文件。

在Java中,类装载器按照以下几个层次划分:

  1. 启动类加载器(Bootstrap Class Loader):

    • 这是JVM的一部分,负责加载Java核心类库,如java.lang包中的类。
    • 它是用本地代码(C++实现)来实现的,因此在Java中无法直接获取其引用。
  2. 扩展类加载器(Extension Class Loader):

    • 这个类加载器负责加载JVM扩展目录(jre/lib/ext目录)中的类库。
    • 开发者可以通过系统属性java.ext.dirs指定扩展目录的位置。
  3. 应用程序类加载器(Application Class Loader):

    • 也称为系统类加载器,负责加载应用程序的类,通常从classpath指定的路径中加载类。
    • 它是Java中最常用的类加载器,也是默认的类加载器。
  4. 自定义类加载器(Custom Class Loaders):

    • 开发者可以通过继承java.lang.ClassLoader类创建自定义的类加载器,用于特定的加载需求,比如从数据库加载类、网络加载等。

双亲委派机制(Parent Delegation Model)

双亲委派机制是Java类加载器的一种设计原则,它通过层级关系来保证类加载的顺序和一致性。其核心思想是当一个类加载器收到加载类的请求时,它首先不会尝试自己加载这个类,而是将加载请求委派给其父类加载器。

具体来说,双亲委派机制的工作原理如下:

  1. 层级结构: 在JVM中,类加载器形成了一种层级结构,通常是树状结构。顶层的类加载器是启动类加载器(Bootstrap Class Loader),它负责加载核心的Java类,比如java.lang.Object等。在它的下方是扩展类加载器(Extension Class Loader),负责加载JVM扩展库中的类,位于jre/lib/ext目录下的类库。再下面是应用程序类加载器(Application Class Loader),也称为系统类加载器,负责加载应用程序的类,通常从classpath指定的路径加载。
  2. 委派机制: 当一个类加载器接收到加载类的请求时,它首先不会自己去尝试加载这个类,而是将请求委派给父类加载器。每一个类加载器都会把类加载请求委派给其父类加载器,直至委派到最顶层的启动类加载器。
  3. 加载顺序: 启动类加载器首先尝试加载类,如果找不到类,则会委派给扩展类加载器;扩展类加载器如果找不到类,则委派给应用程序类加载器;应用程序类加载器再找不到则会尝试自己加载。这样的层级结构保证了类加载的一致性和唯一性,避免了类的重复加载和冲突。
  4. 安全性保证: 双亲委派机制还有助于确保核心API类库不会被篡改,因为启动类加载器加载的类无法被应用程序类加载器加载,从而保护了Java核心类的安全性。

总结来说,双亲委派机制通过层级的类加载器结构和委派加载的策略,保证了类的一致性、唯一性和安全性,是Java类加载机制的重要组成部分。


今夜有点儿凉
37 声望1 粉丝

今夜有点儿凉,乌云遮住了月亮。