有人可以解释一下Class.forName()和Thread.currentThread()。getContextClassLoader()。loadClass()之间的区别。
我有下一个代码

<code>
public class Test {
    static {
        System.out.println("Hello from static block");
         }
}

public class Application {
    public static void main(String[] args) throws ClassNotFoundException {
//Class test = Class.forName("com.home.Test"); //Outputs "Hello from static block"
  Thread.currentThread().getContextClassLoader().loadClass("com.home.Test");
}
}
</code>

当我执行Class.forName(“com.home.Test”)时,它会输出“来自静态块的Hello”。但是当我执行Thread.currentThread()。getContextClassLoader()。loadClass(“com.home.Test”);时,它什么也不输出。

最佳答案

ClassLoader.loadClass(String) 不会解析该类(因此也不会对其进行初始化)。

另一方面, Class.forName(String) 确实初始化了该类。这就是为什么您看到在这种情况下正在运行初始化程序,而不是在使用loadClass时运行的原因。

如果需要详细信息,请在JSL的Excecution部分中描述加载/链接/初始化步骤(这是一个有趣的阅读)。

关于java - Java Class.forName()与Thread.currentThread()。getContextClassLoader()。loadClass(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8106021/

10-11 05:08