Какой цели служит Class.forName (), если вы не используете возвращаемое значение? - PullRequest
20 голосов
/ 21 августа 2009

Я видел эту строку в примере приложения для использования коммерческого драйвера JDBC:

Class.forName("name.of.a.jcdb.driver")

Возвращаемое значение не используется.

Для каких целей служит эта строка?

Ответы [ 6 ]

24 голосов
/ 21 августа 2009

Выполняет статическую загрузку этого класса. Так что все, что находится в блоке static { }, будет работать.

12 голосов
/ 21 августа 2009

Может быть, поможет фрагмент кода. Это от драйвера моста JDBC-ODBC от Sun,

//--------------------------------------------------------------------
// Static method to be executed when the class is loaded.
//--------------------------------------------------------------------


static
{       
    JdbcOdbcTracer tracer1 = new JdbcOdbcTracer();
    if (tracer1.isTracing ()) {
        tracer1.trace ("JdbcOdbcDriver class loaded");
    }

    JdbcOdbcDriver driver = new JdbcOdbcDriver ();

    // Attempt to register the driver

    try {
        DriverManager.registerDriver (driver);
    }
    catch (SQLException ex) {
        if (tracer1.isTracing ()) {
            tracer1.trace ("Unable to register driver");
        }  
    }
}

вызов DriverManager.registerDriver() в статическом блоке выполняется всякий раз, когда драйвер загружается через Class.forName().

Раньше это был единственный способ зарегистрировать драйвер. JDBC 4.0 представил новый механизм регистрации сервисов, поэтому вам больше не нужно делать это с более новыми драйверами, совместимыми с JDBC 4.0.

5 голосов
/ 21 августа 2009

В вашем конкретном примере класс драйвера JDBC содержит статический инициализатор, который регистрирует драйвер как DriverManager .

4 голосов
/ 21 августа 2009

Это используется, в частности, для драйверов JDBC. Класс драйвера JDBC имеет статический блок инициализатора, который регистрирует класс с помощью JDBC DriverManager, так что DriverManager знает о драйвере при последующем открытии соединения с базой данных.

В более новой версии JDBC (я думаю, JDBC 3.0) это больше не требуется, DriverManager использует другой механизм для поиска драйверов JDBC.

edit - На этой странице подробно объясняется, как работает загрузка драйвера JDBC и как он регистрируется в DriverManager (по старинке).

2 голосов
/ 21 августа 2009

В случае драйверов JDBC статический инициализатор запрошенного класса зарегистрирует драйвер с помощью DriverManager JDBC , чтобы получить соединение для URL-адреса драйвера.

1 голос
/ 21 августа 2009

для ручного управления классом загрузки в текущем загрузчике классов

...