30学Java第十天——类加载的过程
类加载过程
在Java中,类加载的过程主要包括以下三个阶段:
- 加载(Loading): 从文件系统或网络中加载字节码到JVM中。
- 链接(Linking): 将字节码的二进制数据合并到JVM中,包括验证、准备和解析。
- 初始化(Initialization): 执行类的静态初始化代码,如静态变量的赋值和静态代码块的执行。
-
加载(Loading)
类加载的第一步是加载。JVM通过类加载器将类的字节码从文件系统(如JAR文件或.class文件)中读取到JVM中。在这一阶段,JVM会创建一个代表这个类的 Class 对象。如何加载:
- JVM查找需要加载的类的二进制字节码。
- 如果字节码存在,就将其加载到内存中。
- 如果类已经加载过,则避免重复加载。
-
链接(Linking)
链接是将加载的类数据合并到JVM中的过程,主要包括以下三个子步骤:
-
验证(Verification):
确保加载的类的字节码符合Java语言的语法和结构规则。
检查字节码文件的正确性,确保安全性。 -
准备(Preparation):
为类的静态变量分配内存并设置默认值。
在这个阶段,类的静态变量被分配内存,但仅被初始化为默认值(例如整型默认值为0,引用类型为null)。 -
解析(Resolution):
将类中的符号引用转换为直接引用。符号引用是指向其他类、字段或方法的字符串表示,而直接引用则是直接指向内存地址。
解析是在程序执行前完成的,避免了运行时的复杂解析。
- 初始化(Initialization)
这是类加载过程中最重要的一步。在这个阶段,JVM会执行类的静态初始化代码,包括:- 调用静态变量的赋值语句。
- 运行静态代码块。
类加载器(ClassLoader)
Java中的类加载器负责加载类。JVM的类加载器分为以下几种:
-
启动类加载器(Bootstrap ClassLoader):
- 负责加载JDK的核心类库,如 java.lang、java.util 等。
- 是C++实现的,无法直接在Java中访问。
-
扩展类加载器(Extension ClassLoader):
- 负责加载JDK的扩展类库。
- 通常指 jre/lib/ext 或通过 java.ext.dirs 指定的路径中类。
-
应用程序类加载器(Application ClassLoader):
- 负责加载用户类,即用户的应用程序类。
- 通常是从classpath中查找类。
-
自定义类加载器:
- 开发者可以通过继承 java.lang.ClassLoader 创建自定义类加载器,以实现特定的类加载策略。
可以通过getPrent() 方法一级一级获取类加载器,等级按照下图。
类加载的优先级
类加载器在加载类时会遵循一定的优先顺序,这在解决类的重复加载和类的隔离方面非常重要。大致顺序如下:
启动类加载器 ==》扩展类加载器 ==》应用程序类加载器 ==》自定义类加载器
双亲委派机制
- 某个类加载接收到加载类的任务时,通常会委托给其 “父” 类加载器 完成加载
- 最“父” 类加载器 无法加载时,会一级一级向下委托加载任务
- 作用:
- 保护程序安全
- 防止类重复加载
注:本文章源于学习动力节点老杜
的java教程视频后的笔记整理,方便自己复习的同时,也希望能给csdn的朋友们提供一点帮助。