java Class.forName和ClassLoader的区别
首先了解类的加载过程
ClassLoader: 抽象类,遵循双亲委派模型,A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system.
ClassLoader加载类的时候,不会进行初始化
Class.forName方法实际上也是调用的ClassLoader来实现的
最后调用的方法是forName0()方法,方法中的第2个参数默认设置为了true,该参数表示是否对加载的类进行初始化,设置为true时会对类进行初始化,这就意味着会执行类中的静态代码块以及对静态变量的赋值等操作.
示例代码
package com.design.pattern.temp; class Super { static { System.out.print("Super "); } } class One { static { System.out.print("One "); } } class Two extends Super { static { System.out.print("Two "); } }
ClassLoader加载类
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<Two> aClass = (Class<Two>) classLoader.loadClass("com.design.pattern.temp.Two");
输出结果:空
Class.forName 加载类
Class<?> aClass1 = Class.forName("com.design.pattern.temp.Two");
输出结果:Super Two