为什么 Java class loader 执行 "static" 内容,比如 Class.forName

Why Java class loader executes "static" content, like Class.forName

我用谷歌搜索了 ClassLoader 和 Class.forName 之间的区别,大多数回答说 Class.forName 将运行 class 的 "static" 部分,而 ClassLoader 则不会。所以我测试了这个:

public static void main(String[] args) {
    try {
        ClassLoader l = ClassLoader.getSystemClassLoader();
        Class c2 = l.loadClass("C");
        Constructor ctor2 = c2.getConstructor();
        C obj2 = (C) ctor2.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它打印:

static
default ctor

好吧,出乎我的意料,ClassLoader 为什么以及何时执行 "static" 部分?如果它也执行"static",那么这2个的核心区别是什么?

非常感谢。

l.loadClass("C"); will not 导致执行静态初始化程序,同时创建实例。

您可以删除以下代码并重试:

Constructor ctor2 = c2.getConstructor();
C obj2 = (C) ctor2.ne