【问题标题】:static block not called when class is loaded [duplicate]加载类时未调用静态块[重复]
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多