Подтвердить что ты не робот

Загрузка драйвера JDBC

Мне сказали, что предпочтительным методом загрузки драйвера JDBC является:

Class.forName(driverName);

Я понимаю, что это лучше для динамического решения нескольких драйверов, возможно, прочитанных из файла конфигурации XML или ввода пользователем. То, что мне интересно, - это то, как вызов этого оператора загружает указанный драйвер в среду, где мы даже не сохраняем результирующий объект класса в любом месте. В записи JavaDocs говорится:

public static Class forName(String className)
                 throws ClassNotFoundExceptionReturns 

возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки

В этом случае, как разработчикам Java удалось облегчить существование объекта драйвера только с этим утверждением?

4b9b3361

Ответ 1

Class#forName() запускает статические инициализаторы (вы знаете, static применяется к классу, а не к экземпляру). Реализация драйвера JDBC должна регистрироваться в статическом инициализаторе.

public class SomeDriver implements Driver {

    static {
        DriverManager.registerDriver(new SomeDriver());
    }

}

Обратите внимание, что существуют багги-драйверы JDBC, такие как org.gjt.mm.mysql.Driver, которые неправильно регистрируются внутри конструктора. Для этого вам понадобится вызов newInstance() после этого на таких драйверах, чтобы заставить их зарегистрироваться.