返回
Java 类加载基础:深入浅出剖析
Android
2024-01-02 17:39:41
**Java 类加载:深入浅出剖析**
## **前言**
Java 类加载是 Java 虚拟机(JVM) 将 .java 文件编译成字节码的过程。在编译期,JVM 会根据需要动态地加载类。这个过程称为类加载。类加载是 Java 虚拟机(JVM) 启动和运行的基础,是保证应用程序正常运行的重要组成部分。
## **Java 类加载基础**
### **引起类加载的场景**
以下场景会引起类加载:
* 使用new创建对象时
* 读取或设置类的**非** 编译期常量**静** 态变量时
* 使用java.lang.reflect包中方法对类进行反射调用时
* 初始化一个类时
### **类加载机制**
类加载机制是指 JVM 将类加载到内存中的过程。类加载机制包括以下几个主要步骤:
1. **查找类:**
- 当应用程序需要加载一个类时,JVM 会首先查找该类是否已在内存中。如果已加载,则直接返回该类。
- 否则,JVM 将会搜索类路径,以找到该类并加载它。
- 类路径是一组目录和 JAR 文件,它们包含应用程序所需的类文件。
2. **编译类:**
- 一旦找到所需的类,JVM 会将其编译成字节码。
- 字节码是 Java 代码的机器可读形式,它包含了类中的所有信息。
3. **创建类对象:**
- 一旦编译完成,JVM 会创建一个类对象来代表该类。
- 类对象包含类的所有信息,包括类名、字段名、方法名等。
- 类对象是 Java 应用程序运行的基础,它是应用程序与 JVM 交互的媒介。
4. **链接类对象:**
- 一旦创建了类对象,JVM 会将其链接到其他类对象。
- 链接是指将类的字段、方法和类常量与其他类对象进行关联。
- 链接完成之后,类对象就可以被应用程序使用。
5. **释放内存:**
- 一旦类加载完成,JVM 会释放内存中存储的临时数据。
- 这些临时数据包括:类文件、字节码、类对象等。
6. **加载类:**
- 一旦内存中存储的临时数据被释放,JVM 就会将类加载到内存中。
- 类加载后,应用程序就可以使用该类了。
### **类加载器**
类加载器是 JVM 用于加载类的工具。类加载器负责查找类文件、编译类文件、创建类对象并将其链接到其他类对象。
Java 虚拟机(JVM) 提供了以下内置类加载器:
* **启动类加载器(Bootstrap ClassLoader)** :
- 启动类加载器负责加载 Java 核心库中的类。
- 启动类加载器是 JVM 最早加载的类加载器。
- 启动类加载器加载的类称为 **核心类库类** (Core Library Class)。
* **扩展类加载器(Extension ClassLoader)** :
- 扩展类加载器负责加载 Java 扩展库中的类。
- 扩展类加载器是 JVM 在启动类加载器之后加载的类加载器。
- 扩展类加载器加载的类称为 **扩展库类** (Extension Class)。
* **系统类加载器(System ClassLoader)** :
- 系统类加载器负责加载应用程序自己的类。
- 系统类加载器是 JVM 在扩展类加载器之后加载的类加载器。
- 系统类加载器加载的类称为 **应用程序类** (Application Class)。
## **深入分析 Java 类加载**
### **类加载过程**
类加载过程通常包括以下步骤:
1. **查找类:**
- 当应用程序需要加载一个类时,JVM 会首先查找该类是否已在内存中。如果已加载,则直接返回该类。
- 否则,JVM 将会搜索类路径,以找到该类并加载它。
- 类路径是一组目录和 JAR 文件,它们包含应用程序所需的类文件。
2. **编译类:**
- 一旦找到所需的类,JVM 会将其编译成字节码。
- 字节码是 Java 代码的机器可读形式,它包含了类中的所有信息。
3. **创建类对象:**
- 一旦编译完成,JVM 会创建一个类对象来代表该类。
- 类对象包含类的所有信息,包括类名、字段名、方法名等。
- 类对象是 Java 应用程序运行的基础,它是应用程序与 JVM 交互的媒介。
4. **链接类对象:**
- 一旦创建了类对象,JVM 会将其链接到其他类对象。
- 链接是指将类的字段、方法和类常量与其他类对象进行关联。
- 链接完成之后,类对象就可以被应用程序使用。
5. **释放内存:**
- 一旦类加载完成,JVM 会释放内存中存储的临时数据。
- 这些临时数据包括:类文件、字节码、类对象等。
6. **加载类:**
- 一旦内存中存储的临时数据被释放,JVM 就会将类加载到内存中。
- 类加载后,应用程序就可以使用该类了。
### **类加载优化**
以下技术可以优化类加载过程:
* **使用类路径:**
- 类路径是一组目录和 JAR 文件,它们包含应用程序所需的类文件。
- 通过将类文件组织到类路径中,可以提高类加载的效率。
* **使用类加载器:**
- 类加载器是 JVM 用于加载类的工具。
- 通过使用类加载器,可以控制类加载的过程。
* **使用反射:**
- 反射是指在运行时获取类的信息。
- 通过使用反射,可以获取类加载器、类名、字段名、方法名等信息。
## **结论**
Java 类加载是 Java 虚拟机(JVM) 将 .java 文件编译成字节码的过程。在编译期,JVM 会根据需要动态地加载类。这个过程称为类加载。类加载是 Java 虚拟机(JVM) 启动和运行的基础,是保证应用程序正常运行的重要组成部分。
类加载过程通常包括以下步骤:
1. **查找类:**
- 当应用程序需要加载一个类时,JVM 会首先查找该类是否已在内存中。如果已加载,则直接返回该类。
- 否则,JVM 将会搜索类路径,以找到该类并加载它。
- 类路径是一组目录和 JAR 文件,它们包含应用程序所需的类文件。
2. **编译类:**
- 一旦找到所需的类,JVM 会将其编译成字节码。
- 字节码是 Java 代码的机器可读形式,它包含了类中的所有信息。
3. **创建类对象:**
- 一旦编译完成,JVM 会创建一个类对象来代表该类。
- 类对象包含类的所有信息,包括类名、字段名、方法名等。
- 类对象是 Java