返回
Java虚拟机系列六:揭秘类加载器背后的秘密
Android
2023-11-03 13:32:08
## 一、类的生命周期
整个类的生命周期分为加载和使用两个阶段。
简单来是这样的:一个物理的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类来自定义类加载器,自定义类加载器可以让我们控制类的加载过程。