Java基础:类加载机制之加载顺序分析

  首先明白类加载三个阶段:加载,连接,初始化连接阶段还分了三个步骤:验证,准备,解析。

类加载

  1. 加载
    .class文件二进制数据加载进内存。
  2. 连接
    把类的二进制合到到JRE中,分三个步骤。
    • 验证:检验加载的类内部结构是否正确,并和其他类协调一致。
    • 准备:为类静态变量分配内存,并设置默认值(仅包含类静态变量,不包含实例变量)。
    • 解析:虚拟机将常量池中的符号引用替换为直接引用。
  3. 初始化
    类静态变量初正确的初始值,执行静态代码块,执行构造方法等。

示例代码

示例一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.java.classloader;

public class Demo1 {

public static void main(String[] args) {
Singleton s = Singleton.getSingleton();
System.out.println("counter1 = " + s.counter1);// = 1
System.out.println("counter2 = " + s.counter2);// = 0

}
}

class Singleton {

/**
* 1. 被调用:加载,连接
* 1.1 验证
* 1.2 准备:给静态变量分配内存,设默认值,singleton=null,counter1=0,counter2=0
* 1.3 解析:符号引用替换成直接引用
* 2. 初始化:
* 2.1 执行构造方法:counter1=1,counter2=1,singleton=对象
* 2.2 给类变量赋正确的初始值:counter1没有赋初始值,还是默认值;counter2=0
*/

private static Singleton singleton = new Singleton();

public static int counter1;
//然后初始化,赋值覆盖了默认值
public static int counter2 = 0;

public Singleton() {
counter1++; //counter1 = 1
counter2++; //counter2 = 1
}

public static Singleton getSingleton() {
return singleton;
}
}

示例二

Java基础:类加载机制之加载顺序分析

http://blog.gxitsky.com/2018/03/19/Java-jdk-3-classloader-loadOrder/

作者

光星

发布于

2018-03-19

更新于

2022-06-17

许可协议

评论