Class.forName和ClassLoader都用于加载类,它们有如下不同:

  • Class.forName会执行类的静态static代码块,然后再加载到jvm。
  • ClassLoader不会执行静态代码块,它遵循双亲委派原则直接加载到jvm。

其根本就是是否执行静态代码块。

举个例子说明

public class ClassLoaderExample{
    public static void main(String[] args) throws ClassNotFoundException  {
        //通过Class.forName
        System.out.println("通过Class.forName");
        Class clz1 = Class.forName("Person");
        System.out.println("---------------------------");
        System.out.println("通过ClassLoader");
        ClassLoader loader = ClassLoader.getSystemClassLoader();
        Class clz2 = loader.loadClass("Person");
    }
}

class Person{
    static{
        System.out.println("静态代码执行");
    }

} 

测试一下

通过Class.forName
静态代码执行
---------------------------
通过ClassLoader
我们看到通过Class.forName执行了静态代码块。