返回

Java虚拟机系列六:揭秘类加载器背后的秘密

Android







## 一、类的生命周期

整个类的生命周期分为加载和使用两个阶段。

简单来是这样的:一个物理的class文件通过二进制流被加载到内存中,jvm会检查这个class文件是否合法合规,合规的class文件会被加载到jvm中,这个过程就是加载阶段。

加载阶段完成以后,jvm就会把这个类的数据存放到元数据区中,所谓的元数据区,就是jvm为了存放类的各种数据的一个地方,而元数据区中存放的信息我们称为元数据,包括类的版本,常量池,方法区域等。

然后,jvm会根据类的元数据信息创建类的实例,这个过程我们称为使用阶段。

类的使用阶段可以分为初始化和运行两个阶段。

初始化阶段,jvm会给类的静态变量进行赋值,并且执行类的静态代码块。

运行阶段,jvm会根据类的实例来执行类的实例方法。

## 二、类加载器

类加载器是jvm加载类的核心组件,负责将class文件加载到jvm中,并把类的元数据信息存放到元数据区。

Java虚拟机规范中定义了三种类加载器:

* 启动类加载器(Bootstrap ClassLoader):负责加载核心类库,比如java.lang包中的类。
* 扩展类加载器(Extension ClassLoader):负责加载扩展类库,比如jre/lib/ext目录下的类。
* 系统类加载器(System ClassLoader):负责加载用户类,比如classpath目录下的类。

## 三、类加载机制

Java虚拟机的类加载机制分为三个步骤:

1. 加载:jvm首先会根据类的全限定名查找类的class文件,如果找到,则将class文件加载到内存中。
2. 验证:jvm会对加载的class文件进行验证,包括文件格式验证,字节码验证,符号引用验证等。
3. 准备:jvm会为类的静态变量分配内存空间,并将其初始化为默认值。

## 四、类加载器的双亲委派机制

双亲委派机制是指类加载器在加载类的时候,会先委托给父类加载器加载,如果父类加载器加载失败,再由自己加载。

这种机制的好处是,可以防止类的重复加载,提高类的加载效率。

## 五、类加载器的作用

类加载器在Java虚拟机中起着重要的作用,主要体现在以下几个方面:

* 加载类:类加载器负责将class文件加载到jvm中,并把类的元数据信息存放到元数据区。
* 查找类:类加载器可以根据类的全限定名查找类的class文件。
* 隔离类:类加载器可以隔离不同类加载器加载的类,防止类的冲突。
* 安全性:类加载器可以对加载的class文件进行验证,防止恶意代码的执行。

## 六、如何自定义类加载器

我们可以通过继承java.lang.ClassLoader类来自定义类加载器。

自定义类加载器可以让我们控制类的加载过程,比如我们可以指定类的加载路径,我们可以对加载的class文件进行修改等。

## 七、总结

类加载器是Java虚拟机加载类的核心组件,负责将class文件加载到jvm中,并把类的元数据信息存放到元数据区。

Java虚拟机规范中定义了三种类加载器:启动类加载器,扩展类加载器,系统类加载器。

Java虚拟机的类加载机制分为三个步骤:加载,验证,准备。

类加载器在Java虚拟机中起着重要的作用,主要体现在加载类,查找类,隔离类,安全性等几个方面。

我们可以通过继承java.lang.ClassLoader类来自定义类加载器,自定义类加载器可以让我们控制类的加载过程。