java的类加载过程

简介: java的类加载过程

Java的类加载过程

Java的类加载过程是一个将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构的过程。这个过程主要由类加载器完成,是Java虚拟机执行Java程序的第一步。

类加载过程大致可以分为以下三个主要阶段:第一通过类的全名获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。第二确保被加载的类的正确性和安全性。为类的静态变量分配内存,并将其初始化为默认值。把类中的符号引用转换为直接引用。第三为类的静态变量赋予正确的初始值。执行静态代码块(即静态初始化器,static{}块中的语句)。

image.png

类加载器在加载类时,首先会检查这个类是否已经被加载过,如果尚未加载,就根据类的全名查找.class文件。这个查找过程涉及到类的搜索路径。当类被找到后,就生成一个对应的Class对象,这个Class对象就被用来作为程序访问方法区中的这些类型数据的外部接口。

image.png

值得注意的是,Java虚拟机规范并没有规定类加载器使用的具体类加载算法,因此不同的虚拟机对于类加载器的实现可能会有所不同。但一般来说,类加载器都需要遵守双亲委派模型(Parents Delegation Model),即一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。采用双亲委派模型的一个好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,从而使得基础类得到统一。

 

相关文章
|
5天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
33 3
|
2天前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
3天前
|
安全 Java 程序员
|
3天前
|
Java
Java Class类
Java Class类
8 0
|
10天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
11天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
14天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
14 0
|
14天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
18 0
|
16天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
23 9
|
17天前
|
JavaScript Java 测试技术
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
30 0
基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)