您的位置:首页 > 其它

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

2006-05-04 23:28 323 查看
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文件格式的字节数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: