Java中Class.forName()和ClassLoader.loadClass()的区别

共同点

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()没有;

只要就是这样一个区别。