原文地址:http://yanwushu.sinaapp.com/class_forname/
java
使用jdbc方式連接數據庫時會經常看到這句代碼:Class.forName(String className)。本文將淺顯地解讀這句代碼的含義。看這篇文章以前應該對java的反射機制有所瞭解,至少是對Class類有必定的瞭解。mysql
初始化參數指定的類,並且返回此類相應的Class 對象(不瞭解Class類的同志,應該首先查看下java反射相關知識)。好比,下面代碼片斷返回 java.lang.Thread 類相應的Class對象。sql
Class t =Class.forName("java.lang.Thread")數據庫
調用forName("X") 將致使名爲 X 的類被初始化。app
類裝載指經過解析類(或者接口)的字節碼文件來構建表明這個類(或是這個接口)的實例的過程。有些像依據藍圖製做一個產品同樣的概念。類裝載有例如如下的兩種方式:jvm
1.Class c1 = Class.forName (String className); 2.ClassLoadercl = new ClassLoader(); Class c1= cl.loadClass(String className, boolean resolve );
Class.forName(String className)使用裝載當前類的類裝載器來裝載指定類。因爲class.forName(String className)方法內部調用了Class.forName(className,true, this.getClass().getClassLoader())方法,如你所見,第三個參數就是指定類裝載器,顯而易見,它指定的是裝載當前類的類裝載器的實例,也就是this.getClass().getClassLoader();this
classLoader.loadClass(StringclassName , boolean resolve);需要手動指定類裝載器的實例。spa
因此這兩種類裝載方式的差異之中的一個是一個默認使用裝載當前類實例的類裝載器來裝載指定類,而還有一個則需要手動指定一個類裝載器的實例。.net
Class的裝載過程(也就是從字節碼文件到生成類的實例這個過程)分爲三個階段,loading(裝載),linking(鏈接)和initializing(實例化)。code
上文提到Class.forName(className)方法內部調用了Class.forName(className, true, this.getClass().getClassLoader())方法。注意第二個參數,它指定Class被loading後是否要進行initializing操做。
ClassLoader.loadClass(className)方法內部調用ClassLoader.loadClass(name,false)方法,第二個參數指出Class在load以後,是否進行link操做。
差異就出來了。Class.forName(className)裝載的class已經被實例化,而ClassLoader.loadClass(className)裝載的class尚未被link,因此就更談不上實例化了。
普通狀況下,這兩個方法效果同樣,都能裝載Class。但假設程序需要Class被實例化,就必須用Class.forName(name)了。
在JDBC中載入驅動類時(關於載入jdbc驅動請參看另一篇文章,<jdbc註冊驅動的三種方式>http://blog.csdn.net/yanwushu/article/details/7574708),Class.forName("com.mysql.jdbc.Driver"),假設換成getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行,因爲它僅僅是向jvm裝載了Driver的類信息,但是並無實例化,也就不能運行對應的操做,因爲Driver是需要被初始化才幹使用的。
1.http://www.iteye.com/topic/15039
2.Class.forName和ClassLoader.loadClass的比較
http://blog.csdn.net/lu7kang/article/details/5576043
http://software.ccidnet.com/pub/disp/Article?columnID=294&articleID=25857&pageNO=1
http://blog.csdn.net/longdick/article/details/1873795
類的實例化過程,定義在The Java Language Specification的12.2,12.3和12.4。