gpt4 book ai didi

Java 这个类加载器与 classForName

转载 作者:行者123 更新时间:2023-12-02 08:02:45 25 4
gpt4 key购买 nike

这两个 Java 语句查找类的方式是否相同?

this.getClass().getClassLoader().loadClass("Foo");

Class.forName("Foo");

最佳答案

它们是不同的:即使它们使用相同的类加载器(请参阅 forName() documentation ) loadClass() 不会运行静态初始化程序,而 forName() 确实如此。

这可以通过以下类轻松演示:

public class ClassA {
static {
System.out.println("ClassA static initializer");
}

public ClassA() {}
}

public class ClassB {
private ClassB() {}

private void loadStuff(boolean initialize) throws ClassNotFoundException {
if (initialize) {
Class.forName("ClassA");
} else {
this.getClass().getClassLoader().loadClass("ClassA");
}
}

public static void main(String[] args) throws ClassNotFoundException {
ClassB b = new ClassB();
b.loadStuff(true); // Try also false
}
}

运行 ClassB 将 true 传递给 loadStuff() 将显示“ClassA 静态初始值设定项”,而运行它将 false 传递给 loadStuff() 则不会显示“ClassA 静态初始值设定项”不显示任何内容。

当然,如果您随后实例化加载的类,则其静态初始化程序将运行(如果尚未执行)。在这种情况下,两种加载类的方法之间的区别在于运行静态初始化程序的时间。

关于Java 这个类加载器与 classForName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8660879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com