有人可以解释一下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/