2013-12-08 67 views
0

以下是連接到MySQL數據庫在JDBC使用Class.forName

// This will load the MySQL driver, each DB has its own driver 
    Class.forName("com.mysql.jdbc.Driver"); 
    // Setup the connection with the DB 
    connect = DriverManager 
     .getConnection("jdbc:mysql://localhost/feedback?" 
      + "user=sqluser&password=sqluserpw"); 

我正在學習用Java反射在哪裏可以使用 的Class.forName()

Class c = Class.forName("java.awt.Button"); 
獲得類的代碼

是使用的語法。

我的問題是爲什麼MySQL ForName不需要被變量捕獲?

+2

你是什麼意思_did不需要被捕獲Class_? –

回答

4

你的意思是爲什麼不把Class對象保存到變量中。 因爲它不是必需的。該類只需要加載,實際的對象是多餘的。

此外,你甚至不需要再做Class.forName()。如果您使用的是JDBC類型4(純Java)驅動程序,那麼驅動程序將自動從類路徑中找到。

4

致電forName()您強制課程初始化(這不僅僅是加載它)。在那個過程中,一些靜態的初始化器運行,它用JDK中的JDBC管理器代碼註冊該特定的類。這使得JDK內部可以使用驅動程序實例,並且它隱式地用於後面的所有代碼中。不可否認,依靠不直觀的反射調用是JDBC作者的一個糟糕設計,但在Java早期,選擇的時間比今天少,而Java的世界並不那麼艱難。這是一種尚未吸引認真採用的語言。

+0

我不確定如果使用反射是一個不好的選擇。如果您閱讀較舊的JDBC規範,您會感覺到他們將驅動程序選擇視爲運行時選擇,而不是設計/開發時間選擇。對於運行時選擇,反射(直接或隱藏在像JDBC 4.0自動加載之類的抽象背後)是唯一真正的選擇。它還促進了API的使用,而不是具體的類。 –

+1

@MarkRotteveel是的,我只評論採用裸露反射調用的方法,並依靠類初始化來註冊驅動類,這是不直觀的,並繼續混淆初學者到今天。 –