共同点
1. 两者都会将用户指定的类加载到内存中,供用户使用
不同点
1. Class.forName有两个重载的方法,分别是:
public static Class<?> forName(String name, boolean initialize, ClassLoader
loader)
public static Class<?> forName(String className)
第一个方法,可以指定要不要始化加载类的static区块和static变量,用户自己可以指定ClassLoader;
第二个方法的具体实现是:
return forName0(className, true,
ClassLoader.getClassLoader(Reflection.getCallerClass()));
也就是说,如果使用第二个方法的话,默认会初始化加载类的static区块和static变量,使用的ClassLoader是当前调用者的ClassLoader;
2. ClassLoader.loadClass()也是有两个重载方法,分别是:
public Class<?> loadClass(String name)
protected Class <?> loadClass(String name, boolean resolve)
第一个方法的具体实现是:
return loadClass(name, false);
第二个参数的意思是再加载类的时候要不要resolve对应的符合,具体可参见
http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.3 ,
它和上面的要不要初始化不一样。
第二个方法注意是protected的,所有只能是子类来调用。
所以,Class.forName方法有要不要初始static变量的参数,而ClassLoader.loadClass()没有;
只要就是这样一个区别。