可以看到Class类中有两个重载方法, 这个两个方法最终都会调用forName0这个方法
forName0方法主要参数含义
- className: 类全限定名
- initialize : 是否初始化
- loader : 类加载器
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
public static Class<?> forName(String name, boolean initialize,
ClassLoader loader) throws ClassNotFoundException{
Class<?> caller = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
// 只有在安全管理器存在的情况下,才需要使用反射调用来获取调用器类。否则避免打这个调用的开销。
caller = Reflection.getCallerClass();
if (sun.misc.VM.isSystemDomainLoader(loader)) {
ClassLoader ccl = ClassLoader.getClassLoader(caller);
if (!sun.misc.VM.isSystemDomainLoader(ccl)) {
sm.checkPermission(
SecurityConstants.GET_CLASSLOADER_PERMISSION);
}
}
}
return forName0(name, initialize, loader, caller);
}
Class.forName会调用ClassLoader来加载对象, 单个参数的方法默认会初始化对象.
ClassLoader,类加载器, 只对字节码文件进行加载, 分配静态变量空间.