返回

Java 类加载基础:深入浅出剖析

Android







**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