【发布时间】:2018-10-03 07:13:53
【问题描述】:
我的印象是加载类时会调用类的静态初始化块。
(例如看到这个答案: https://stackoverflow.com/a/9130560/889742 )
但是这个测试表明静态块不是在类加载时调用的,而是稍后在第一次使用时调用的。
为什么?
class Test
{
static
{
System.out.println("In test static block");
}
static int x;
}
public class xxxx {
public static void main(String[] args) throws Exception {
Class<?> clasz = ClassLoader.getSystemClassLoader().loadClass("Test");
//at least one of these lines is required for static block to be called
//Test.x = 1;
//clasz.newInstance();
}
}
【问题讨论】:
-
但是这个测试显示静态块不是在类加载时调用的,而是在第一次使用时调用的。——因为你的理解不正确?
-
Java 语言规范:“类中声明的静态初始化程序在类初始化时执行”而不是在加载时执行 - 而且您没有实例化或访问它的任何成员。
-
@CarlosHeuberger 介意详细回答吗?
-
loadClass 不调用静态块阅读更多 - stackoverflow.com/questions/8100376/…
标签: java classloader dynamic-class-loaders static-block