加载类时不调用静态块

时间:2018-10-03 07:13:53

标签: java classloader dynamic-class-loaders static-block

给人的印象是,加载类时会调用类的静态初始化块。

(例如,参见以下答案: 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();
    }

}

1 个答案:

答案 0 :(得分:0)

静态块仅执行一次:第一次创建该类的对象或第一次访问该类的静态成员(即使您从未创建该类的对象)。

参考:https://www.geeksforgeeks.org/g-fact-79/

在您的情况下,您只是在加载类而不是初始化类的对象。