2015-05-29 3 views
0

По каким-то причинам я смотрел на rt.jar, и там я видел некоторые пакеты, такие как java.sql. * Среди других.Спецификации интерфейсов J2SE и реализации этих интерфейсов

В типичной программе JDBC мы пишем (для класса Connection, например):

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 (как интерфейс), а фактическая реализация происходит из классов драйверов.

Если мое предположение верно, в общем, нам нужно включить банку с определениями интерфейса, чтобы включить импорт.

Например, рассмотрим такую ​​ситуацию:

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(), поэтому мне нужно включить оба эти банки?

+1

Да ................ – ZhongYu

+0

@ bayou.io Почему бы вам не написать ответ? –

+0

@ Würgspaß - coz Я ленив? :) – ZhongYu

ответ

2

Корпус для java.sql.Connection заключается в том, что драйвер обеспечивает классы реализации для этого и других интерфейсов, таких как java.sql.Statement, java.sql.ResultSet и далее. Все magic привязки интерфейса к правильной реализации класса происходит в методе DriverManager#getConnection, который вызывает внутренний метод private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException, который инициализирует соответствующий экземпляр java.sql.Connection.

Конечно, вы можете использовать подобный подход в вашем коде, который будет использовать отражение для:

  • Найти правильную реализацию интерфейса
  • Если есть надлежащее выполнение, создать экземпляр этого класса ,
  • Верните экземпляр этого класса после инициализации и запуска.
  • Выбросить правильное исключение (исключения), если класс не может быть найден или если он имеет какую-либо проблему с инициализацией.

Пожалуйста, не думайте, что просто создание флага, содержащего интерфейсы, и другое, содержащее классы реализации этих интерфейсов, автоматически подключится к вам на лету, чего не произойдет.

+0

На самом деле вы также можете вызвать DriverManager # getDriver, а затем вызвать Driver # connect, поэтому, если вам нужно повторно подключиться, у вас уже есть правильная реализация. Кроме того, вы могли бы сказать, что каждая реализация драйвера имеет метод acceptsURL (...), так что DriverManager должен только спросить каждую реализацию и получить тот, который действительно принимает URL. –

+0

@NyamiouTheGaleanthrope моя точка здесь: вы не можете просто создать интерфейс и реализацию и ожидать, что Java загрузит реализацию для вас и инициализирует ваш интерфейс на лету. Вы должны сделать это как-то, и «Driver # getConnection» не является исключением из этого правила. –

Смежные вопросы