2015-05-29 40 views
0

由於某些原因我在尋找rt.jar,並且在那裏我看到了一些包,如java.sql。*等等。這些接口的J2SE接口規範和實現

在我們寫(用於連接類,例如)一個典型的JDBC程序:

import java.sql.Connection; 

作爲每文檔,java.sql.Connection中是接口,而不是具體的實現,和java.sql.Connection中在rt.jar中。當我們編寫jdbc程序時,我們需要jdbc驅動程序,並且從我讀的jdbc驅動程序實現接口(例如java.sql.Connection)。

所以,當我們寫在典型的Java程序:(並加載JDBC驅動程序)

import java.sql.Connection; 

- >確實java.sql.Connection中來自的rt.jar或驅動程序類。

從我猜,在這種情況下,java.sql.Connection必須來自rt.jar(作爲接口),而實際的實現來自驅動程序類。

如果我的假設是正確的,通常我們需要包含具有接口定義的jar以包含導入。

例如,考慮這種情況:

package com.vipin.myinterface; 

public interface Interface1 { 
     public void print(); 
} 

如果我們包以上接口interface1.jar。

假設Concrete1.java實現了這個接口:

package com.vipin.concrete1; 
    public class Concrete1 implements Interface1 { 

     public void print() { 
       //code 
     } 
    } 

而這種包裝罐中 - > concrete1.jar。

現在,假設我正在編寫使用print()方法的應用程序,那麼我是否需要同時包含這些jar?

+1

是................ – ZhongYu

+0

@ bayou.io你爲什麼不寫一個答案? –

+0

@Würgspaß - 因爲我很懶惰? :) – ZhongYu

回答

2

java.sql.Connection的情況是驅動程序爲此接口和其他接口(如java.sql.Statement,java.sql.ResultSet等)提供了實現類。將接口綁定到適當的類實現的所有魔術發生在方法DriverManager#getConnection中,該方法調用將初始化java.sql.Connection的適當實例的內部方法private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException

當然,你也可以在代碼中使用了類似的方法,將使用反射:

  • 查找界面的正確實施
  • 如果有一個正確實施,創建這個類的一個實例。
  • 初始化並運行後返回此類的實例。
  • 如果無法找到該類或者它有任何初始化問題,則拋出適當的異常。

請不要以爲只是創建一個包含接口的jar而另一個包含這個接口的實現類會自動爲您動態連接,這是不會發生的。

+0

其實你也可以調用DriverManager#getDriver,然後調用Driver#connect,所以如果你必須重新連接,你已經有了正確的實現。此外,您可能會說每個驅動程序實現都有一個方法acceptURL(...),以便DriverManager只需詢問每個實現並獲取接受url的實現。 –

+0

@NyamiouTheGaleanthrope我在這裏指出的是:你不能只是創建一個接口和一個實現,並期望Java爲你加載實現並初始化你的接口。你必須以某種方式做到這一點,並且'Driver#getConnection'不是這個規則的例外。 –