Class.forName()与load.loadClass()比较

Class.forName()与Loader.loadClass()的区别
 两者的共同性:实现动态扩展程序.
 先来看看两者的使用方式:
 1、 Class.forName()
 存在两种方式
public static Class forName(String classname)
public static Class forName(String classname, boolean initialize, ClassLoader loader)
 classname: 类型的全限定名
 initialize: 是否进行连接并初始化
 ClassLoader: 使用的loader, 当为null时表示使用默认的启动类loader。
 
 2、load.LoadClass()
 存在两种方式:
protected Class loadClass(String classname)
protected Class loadClass(String classname, boolean resolve)
 classname: 类型的全限定名
 resolve: 装载时是否执行该类的连接。(连接包括三个步骤:检验被装载的类型,准备《包括为类型分配内存》,解析类型中的符号引用《可选》)
 loadClass仅仅试图装载请求的类型,而不关心类型是否被连接了。(Java虚拟机规范中对何时实现连接给了一定的自由,因此,即时使用resolve为true,得到的类型也可能没有被连接.所以在1.1版本之后,resolve参数就没有作用了)
 
 好, 现在来看看两者的不同之处:
 1. Class.forName()的长处: 装载类型的时候一定会被连接、被初始化, 而loader.loadClass()则不能保证这一点.
 我们什么时候会需要这个特性呢。最常用的地方就是JDBC驱动程序的装载(静态初始化方法中,向DriverManager注册驱动程序),不仅仅被加载,而且还要保证驱动程序类被初始化。假若一个驱动程序被装载了,但没有初始化,那么类的表态初始化方法就无法被执行,预支程序就没有在DriverManager中被注册,驱动程序就无法被应用程序使用.
 2. forName不足:以定制的方式把类型的全限定名转换成一个Java class文件格式的字节数组。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值