为什么 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
我用谷歌搜索了 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