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执行了静态代码块。静态代码执行
---------------------------
通过ClassLoader