**相同点:都是反射中用来构造类的两种手段。
不同点:Class.forName()装载完类信息后会一直进行到类加载过程的最后一步:初始化;
而ClassLoader.loadClass()则装载完类信息后就停止了。**
为了更好地理解不同点,我们还要聊聊类的加载过程(因为不同点就发生在这里)。
我们都知道,在Java里,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:
装载、链接和初始化,而链接又可以分成校验、准备和解析三步。除了解析外,其它步骤是
严格按照顺序完成的,各个步骤的主要工作如下:
-
装载:查找并导入类或接口的二进制数据。
-
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可选的。
-
校验:检查步骤1导入的二进制数据的正确性。
-
准备:给类的静态变量分配及初始化存储空间。
-
解析:将符号引用转换成直接引用。
-
初始化:初始化静态变量及静态代码块。
Class.forName(className)方法,其实真正调用的是Class.forName(className,true,classloader)方法。注意看第2个boolean参数,它表示的意思是在步骤1完成后必须初始化。所以被装载对象的静态变量及静态代码块均已经被初始化。
再看ClassLoader.loadClass(className)方法,其实他真正调用的方法是ClassLoader.loadClass(className,false);还是注意看第2个 boolean参数,该参数表示对象被装载后不进行链接,自然也就不会进行到初始化这一步了。
本文详细解析了Java反射中Class.forName与ClassLoader.loadClass两种类加载方式的异同。Class.forName在加载类信息后会继续进行初始化,而ClassLoader.loadClass仅加载类信息而不初始化,展示了两者在类加载过程中的不同作用。
4993

被折叠的 条评论
为什么被折叠?



