java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JVM原理之类加载过程

JVM原理之类加载的全过程

作者:mikey棒棒棒

文章详细介绍了Java类加载过程,包括加载、链接、初始化、使用和卸载五个阶段,并解释了符号引用和直接引用的区别,以及类变量和实例变量的区别,此外,还介绍了Class.forName()方法的作用和使用场景

JVM原理-类加载过程

Java类加载过程

可以看作是将我们写的代码(以class文件的形式)转化为可以运行的程序。

这过程分为几个步骤:加载、链接、初始化、使用和卸载。

1.加载:找到并打开书

2. 链接:检查书的内容和准备好工具

链接阶段包括验证、准备和解析三个步骤:

验证:检查书里的内容是否有错误。

准备:为静态变量分配内存并初始化为默认值。

解析(可选):把间接引用转换为直接引用。

3. 初始化:翻开书并开始阅读

过程:正式开始根据书里的内容进行设置和操作。

对应Java的过程:执行类的初始化,包括:

4. 使用:开始利用书中的信息

步骤:

  1. 分配内存:为新对象分配内存。
  2. 设置默认值:对象的属性被初始化为默认值(如数字为0,对象引用为null)。
  3. 执行初始化代码:按照代码中定义的顺序为属性赋值。
  4. 执行构造函数:运行构造函数,进行进一步初始化和操作。

5. 卸载:书用完后放回书架

对类初始化的5种情况

根据JVM规范,类初始化的情况有且只有以下5种:

  1. 创建类的实例:当我们用new来创建类的对象时,比如new Dog(),如果这个类还没有被初始化,那么它必须先初始化才能创建对象。
  2. 调用类的静态方法:比如Dog.bark(),静态方法属于类本身而不是某个对象,因此在调用时,类必须先初始化。
  3. 访问类或接口的静态变量:当我们访问类的静态变量时,比如Dog.age,这也会导致类的初始化。
  4. 使用Class.forName()方法:这种方法会强制初始化一个类。比如Class.forName("Dog")会让Dog类被加载并初始化。
  5. 类加载器启动主类:当我们运行一个程序时,比如执行java DogMain,JVM会先初始化DogMain类并执行它的main方法。

符号引用和直接引用的区别是什么?

类变量和实例变量

类变量(静态变量)

实例变量

Class.forName()

Class.forName()的主要作用是 动态加载类,尤其是在需要根据类名字符串来加载类的情况下(比如 JDBC 驱动程序、反射等)。

这提供了一种灵活的方式,允许你在运行时加载类,而不是在编译时绑定类。

当你调用这个方法时,JVM 会尝试根据你传递的类名(作为字符串)加载该类,并且会执行该类的静态代码块(如果有的话)。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文