JDBC連接中的Class.forName()解惑

      有過JDBC連接經驗的朋友都知道,連接時首先需要加載數據庫驅動,一般都是用Class.forName("xxx.xxx.xxx")來加載的。Class描述的是類信息,forName()是Class的靜態方法,用來將字符串指定的類動態加載進來,它返回的是一個Class對象,查看API知道其方法爲  

    Class forName(String className);

    className是完整的類名,如mysql的驅動名"com.mysql.jdbc.Driver"。很奇怪的是,驅動加載進來之後,我們並沒有對它進行操作實例化出一個對象,因爲一般類加載進來之後,都需要調用Class類的newInstance()靜態方法來創建一個對象,以便進行各種操作。因此,單單使用Class.forName()動態加載類是沒有用的,往往都需要實例化出一個對像來。

    Class.forName("")返回的是Class

    Class.forName("").newInstance()返回的是object

    爲什麼我們在加載驅動包的時候,往往只需要Class.forName("")就已經足夠了,而不需要再newInstance()一下呢?很多人覺得很奇怪,這樣加載之後,又沒有實例化出一個對象,我們怎麼來創建數據庫連接等等呢,我們要根據這個驅動創建與之匹配的連接啊。

     剛纔提到,Class.forName("");的作用是要求JVM查找並加載指定的類,如果在類中有靜態初始化器的話,JVM必然會執行該類的靜態代碼段。而在JDBC規範中明確要求這個Driver類必須向DriverManager註冊自己,即任何一個 JDBC Driver的Driver類的代碼都必須類似如下:

     這裏面有一個靜態代碼塊,在JVM加載類的時候,會執行這段代碼,並向DriverMananger註冊自己,這樣DriverManager 就知道這個驅動了。因此,在這裏並不需要再newInstance()一下,這樣做是多餘的,這樣創建的對象可能永遠都不會被用到。 這裏給出一個實際的Driver例子源代碼,mysql的Driver類:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章