2014-05-01 77 views
1

我在Eclipse中使用過一次GSON庫,它非常容易。 剛剛添加它作爲外部庫和源文件我已經導入它,並能夠像使用Java中的任何其他類一樣使用它。 例子:Java JAR(庫)使用

Gson gson = new Gson(); //and just use it 

最近,我曾與​​數據庫文件的工作,所以我下載了JDBC驅動程序庫,並在我的Eclipse項目添加它。 但我注意到使用它的語法有點奇怪(至少對我來說)。 我已經導入java.sql.*但能夠使用它的類我必須做到以下幾點:

Class.forName("org.sqlite.JDBC"); 

我知道,從這個命令的返回值是類對象(運行時),但你可以看到從它從不使用的語法。

請解釋那裏發生了什麼,以及爲什麼我不能首先使用SQL包類而不調用Class.forName

+0

[Class.forName(「org.sqlite.JDBC」);''是否可能重複(http://stackoverflow.com/questions/6740601/what-does-class-fornameorg-sqlite-jdbc-do) –

回答

1

它動態地加載一個類。 What does Class.forname method do?是關於它的好文章,它也解釋了爲什麼數據庫驅動程序需要它:

讓我們來看看爲什麼你需要的Class.forName()的驅動程序加載到內存中。所有JDBC驅動程序都有一個靜態塊,它向DriverManager註冊自己,而DriverManager只具有靜態初始化程序。

MySQL JDBC驅動程序有一個靜態初始化看起來是這樣的:

static { 
    try { 
     java.sql.DriverManager.registerDriver(new Driver()); 
    } catch (SQLException E) { 
     throw new RuntimeException("Can't register driver!"); 
    } 
} 

JVM執行靜態塊和驅動器本身向DriverManager註冊。

您需要一個數據庫連接來操作數據庫。爲了創建到數據庫的連接,DriverManager類必須知道你想使用哪個數據庫驅動程序。它通過迭代已向其註冊的驅動程序的數組(在內部爲Vector)並在數組中的每個驅動程序上調用acceptsURL(url)方法,從而有效地要求驅動程序告訴它它是否可以處理JDBC URL。

來源 - What does 'Class.forName("org.sqlite.JDBC");' do?

+0

我認爲這將是一個更清潔的方式來強制驅動程序註冊本身是使用靜態方法讓說Init。 Class.forName看起來就像是一種解決方法,可以使JVM調用驅動程序的靜態初始化程序。 – JobNick

+0

而不是複製一個你可能被標記爲與該問題重複的答案。 –

+0

@MarkRotteveel哦,對不起,我知道可以標記爲重複,但認爲它只適用於管理員。我只是試圖幫助,因爲我自己是一個新的StackOverFlow :) – jamierocks

0

基本上,它可以讓你的代碼是使用其實施java.sql.*庫的JVM寄存器。這樣,您就可以依靠標準接口,而無需經歷需要實現級別細節的環節和障礙。