Java的Class.forName()和Thread.currentThread().getContextClassLoader().loadClass()有什么区别?

3
有人能解释一下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 from static block"。但是当我执行 Thread.currentThread().getContextClassLoader().loadClass("com.home.Test"); 时,它没有输出任何内容。

1个回答

3

ClassLoader.loadClass(String) 无法解析类(因此也不会初始化它)。

Class.forName(String) 则会初始化该类。这就是为什么在使用 loadClass 时看不到初始化程序运行的原因。

如果您想了解详细信息(非常有趣),可以查看JSL中的执行部分,其中描述了加载/链接/初始化步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接