loadclass java_Java类加载:Class.forName(..)与ClassLoader.loadClass(..)的区别

本文某些内容转载至:http://www.cnblogs.com/suibianle/p/6676215.html

一、Class.forName(..)与ClassLoader.loadClass(..)的作用:都是通过类的全限定名完成类装载,获取该类的Class对象。

二、类装载的过程:

51aee533b8170041ba818345d5cb641e.png

(1)类加载:Jvm把class文件字节码加载到内存中,并将这些静态数据装换成运行时数据区中方法区的类型数据,在运行时数据区堆中生成一个代表这个类

的java.lang.Class对象,作为方法区类数据的访问入口。

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

(3)初始化:执行类变量赋值和静态代码块。

三、Class.forName(..)与ClassLoader.loadClass(..)进行类装载的过程。

(1)Class.forName(className) 在执行该方法时,其实该方法内部调用的是它的一个重载方法:forName(className,boolean,ClassLoader)

该重载方法共有三个参数,其中,第一个参数是类的包路径,第二个是一个布尔值,默认为true;表示在类加载时会进行初始化。第三个参数指一个类加载器,默认使用的就是当前类使用的类加载器。

(2)ClassLoader.loadClass(className) 在执行该方法时,其实该方法内部也是调用一个重载方法:loadClass(className,boolean)

该重载方法共有两个参数,其中,第一个参数是类的包路径,第二个是一个布尔值,默认是false;表示类加载时不会链接,同样也不进行初始化。

综上所述,可知Class.forName(..)与ClassLoader.loadClass(..)的主要区别是:

Class.forName得到的class是已经初始化完成的,该方法适合那些在类加载时需要初始化一些东西的情况。比如,加载数据库驱动。

Classloder.loaderClass得到的class是还没有链接的,该方法适合在类加载时不需要一些初始化的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值