当谈论Java虚拟机(JVM)的类装载器时,我们指的是JVM内部的一种机制,负责在运行时加载Java类文件到内存中,并生成对应的Java类对象。类装载器在Java程序运行过程中起到了重要作用,它不仅负责加载应用程序的类,还负责加载JVM自身需要的类和库。
类装载器(Class Loader)
类装载器的主要职责是动态加载Java类到JVM中,并在需要时解析这些类的字节码。它们通常按照层级关系组织,每个类装载器负责加载特定位置或者特定来源的类文件。
在Java中,类装载器按照以下几个层次划分:
启动类加载器(Bootstrap Class Loader):
- 这是JVM的一部分,负责加载Java核心类库,如
java.lang
包中的类。 - 它是用本地代码(C++实现)来实现的,因此在Java中无法直接获取其引用。
- 这是JVM的一部分,负责加载Java核心类库,如
扩展类加载器(Extension Class Loader):
- 这个类加载器负责加载JVM扩展目录(
jre/lib/ext
目录)中的类库。 - 开发者可以通过系统属性
java.ext.dirs
指定扩展目录的位置。
- 这个类加载器负责加载JVM扩展目录(
应用程序类加载器(Application Class Loader):
- 也称为系统类加载器,负责加载应用程序的类,通常从classpath指定的路径中加载类。
- 它是Java中最常用的类加载器,也是默认的类加载器。
自定义类加载器(Custom Class Loaders):
- 开发者可以通过继承
java.lang.ClassLoader
类创建自定义的类加载器,用于特定的加载需求,比如从数据库加载类、网络加载等。
- 开发者可以通过继承
双亲委派机制(Parent Delegation Model)
双亲委派机制是Java类加载器的一种设计原则,它通过层级关系来保证类加载的顺序和一致性。其核心思想是当一个类加载器收到加载类的请求时,它首先不会尝试自己加载这个类,而是将加载请求委派给其父类加载器。
具体来说,双亲委派机制的工作原理如下:
- 层级结构: 在JVM中,类加载器形成了一种层级结构,通常是树状结构。顶层的类加载器是启动类加载器(Bootstrap Class Loader),它负责加载核心的Java类,比如
java.lang.Object
等。在它的下方是扩展类加载器(Extension Class Loader),负责加载JVM扩展库中的类,位于jre/lib/ext
目录下的类库。再下面是应用程序类加载器(Application Class Loader),也称为系统类加载器,负责加载应用程序的类,通常从classpath
指定的路径加载。 - 委派机制: 当一个类加载器接收到加载类的请求时,它首先不会自己去尝试加载这个类,而是将请求委派给父类加载器。每一个类加载器都会把类加载请求委派给其父类加载器,直至委派到最顶层的启动类加载器。
- 加载顺序: 启动类加载器首先尝试加载类,如果找不到类,则会委派给扩展类加载器;扩展类加载器如果找不到类,则委派给应用程序类加载器;应用程序类加载器再找不到则会尝试自己加载。这样的层级结构保证了类加载的一致性和唯一性,避免了类的重复加载和冲突。
- 安全性保证: 双亲委派机制还有助于确保核心API类库不会被篡改,因为启动类加载器加载的类无法被应用程序类加载器加载,从而保护了Java核心类的安全性。
总结来说,双亲委派机制通过层级的类加载器结构和委派加载的策略,保证了类的一致性、唯一性和安全性,是Java类加载机制的重要组成部分。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。