Java类加载

🎅 引入

思考如下代码段,会打印出HungrySingleton init…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ClazzLoadDemo {
public static void main(String[] args) {
Class<ClazzLoadDemo> clazz = ClazzLoadDemo.class;
}
}

class HungrySingleton {
public static String name = "HuangHao";

static {
System.out.println("HungrySingleton init...");
}

private static HungrySingleton instance = new HungrySingleton();

private HungrySingleton() {
}

private static HungrySingleton getInstace() {
return instance;
}
}

我们知道,当一个 类加载 时,类中代码执行的优先级为

静态域代码块 > 构造代码块 > 构造方法

静态代码优先级这么高,竟然也未被执行,或许是说,我们的HungrySingleton类根本就未被加载

📖 根源

可以触发类加载的条件有

  • 第一次new该类的对象

  • 该类写在了main函数中

  • 访问了该类的静态属性,方法

🎁 解决

当我们访问该类的静态属性时,即把main函数中的代码改为

1
2
3
public static void main(String[] args) {
System.out.println(HungrySingleton.name);
}

此时会打印出HungrySingleton init…


Java类加载
http://example.com/2022/10/04/Java类加载/
作者
HuangHao
发布于
2022年10月4日
许可协议