Class.forName()与ClassLoader.loadClass()的区别

本文详细解析了Java反射中Class.forName与ClassLoader.loadClass两种类加载方式的异同。Class.forName在加载类信息后会继续进行初始化,而ClassLoader.loadClass仅加载类信息而不初始化,展示了两者在类加载过程中的不同作用。

原文地址: https://my.oschina.net/gpzhang/blog/486743

**相同点:都是反射中用来构造类的两种手段。
不同点:Class.forName()装载完类信息后会一直进行到类加载过程的最后一步:初始化;
而ClassLoader.loadClass()则装载完类信息后就停止了。**
为了更好地理解不同点,我们还要聊聊类的加载过程(因为不同点就发生在这里)。
我们都知道,在Java里,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:
装载、链接和初始化,而链接又可以分成校验、准备和解析三步。除了解析外,其它步骤是
严格按照顺序完成的,各个步骤的主要工作如下:
  1. 装载:查找并导入类或接口的二进制数据。

  2. 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可选的。

  3. 校验:检查步骤1导入的二进制数据的正确性。

  4. 准备:给类的静态变量分配及初始化存储空间。

  5. 解析:将符号引用转换成直接引用。

  6. 初始化:初始化静态变量及静态代码块。

    Class.forName(className)方法,其实真正调用的是Class.forName(className,true,classloader)方法。注意看第2个boolean参数,它表示的意思是在步骤1完成后必须初始化。所以被装载对象的静态变量及静态代码块均已经被初始化。
    再看ClassLoader.loadClass(className)方法,其实他真正调用的方法是ClassLoader.loadClass(className,false);还是注意看第2个 boolean参数,该参数表示对象被装载后不进行链接,自然也就不会进行到初始化这一步了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值