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

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

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

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

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


person Daniel Rikowski    schedule 21.08.2009    source источник
comment
В настоящее время я бы назвал это антипаттерном и предпочел бы что-то вроде «DriverManager.register(JdbcDriver.class)»…   -  person Andreas Dolk    schedule 21.08.2009
comment
использование register напрямую требует, чтобы вы заранее знали класс драйвера. я бы назвал это анти-шаблоном. наличие класса в качестве свойства конфигурации (и, следовательно, Class.forName) имеет для меня гораздо больше смысла.   -  person james    schedule 21.08.2009
comment
См. stackoverflow.com/q/8053095/632951 для получения дополнительной информации.   -  person Pacerier    schedule 25.08.2014


Ответы (6)


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

person Noon Silk    schedule 21.08.2009
comment
Что позволяет классу драйвера зарегистрироваться в среде JDBC. Это необходимо, чтобы позволить JDBC правильно распознавать URL-адрес подключения, который вы передаете в последующих вызовах. - person Michal; 21.08.2009
comment
статическая нагрузка? это не просто загрузка класса, который запускает любой статический инициализатор (статический блок И статические переменные/константы)? - person user85421; 21.08.2009

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

//--------------------------------------------------------------------
// 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.

person ZZ Coder    schedule 21.08.2009

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

person Michael Borgwardt    schedule 21.08.2009

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

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

редактировать — Эта страница подробно объясняет, как работает загрузка драйвера JDBC и как драйвер регистрируется в DriverManager (старым способом).

person Jesper    schedule 21.08.2009
comment
У кого-нибудь есть ссылка на описание нового механизма? Мне нужно нечто подобное. - person Thorbjørn Ravn Andersen; 21.08.2009
comment
В javadoc для DriverManager из JDK 6 рассказывается о нескольких методах для DriverManager для поиска драйверов: java.sun.com/javase/6/docs/api/java/sql/DriverManager.html - person Bombe; 21.08.2009

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

person Bombe    schedule 21.08.2009

вручную загрузить класс в текущем загрузчике классов

person Community    schedule 21.08.2009