资料-Java基础:类加载方式及差异
虚拟机加载类的途径
两个异常(exception) Class.forName与ClassLoader.loadClass区别Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize).Class.forName(className)实际上是调用Class.forName(className,true,this.getClass().getClassLoader())。第二个参数,是指Class被loading后是不是必须被初始化。ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name,false),第二个参数指Class是否被link。Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。例如,在JDBC编程中,常看到这样的用法,Class.forName(“com.mysql.jdbc.Driver”).如果换成了getClass().getClassLoader().loadClass(“com.mysql.jdbc.Driver”),就不行。com.mysql.jdbc.Driver的源代码如下:// Register ourselves with the DriverManagerstatic {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException(“Can’t register driver!”);}}原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |