他们是完全不同的!
Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to: Class.forName(className, true, currentLoader)
(这里指的是你想要初始化类吗?)
Invoking this method is equivalent to invoking loadClass(name, false).
(这里,布尔值与初始化无关;但是如果检查loadClass(String,boolean)文档,你会看到它所做的只是加载类,而不是初始化它).
第一个(Class.forName(“SomeClass”);)将:
>使用加载调用此代码的类的类加载器
>初始化类(即,将运行所有静态初始化程序)
另一个(ClassLoader.getSystemClassLoader().loadClass(“SomeClass”);)将:
>使用“system”类加载器(which is overridable)
>不初始化类(例如,如果您使用它来加载JDBC驱动程序,它将不会被注册,并且您将无法使用JDBC!)
假设您正在编写将在Tomcat等容器上执行的Web应用程序. Tomcat所做的是为每个Web应用程序创建一个类加载器(以便以后可以卸载Web应用程序并释放内存 – 您需要一个专用的类加载器才能使用它!).在这种情况下,您可以看到两个调用都会产生完全不同的结果!
有关类加载和初始化的更详细(和权威)信息,请查看最新(第3版)Java语言规范的第12.2和12.4节.