Какова цель этой строки?
Это не возвращает значение или установить состояние существующего класса/объекта (или это?)
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Почти наверняка com.mysql.jdbc.Driver имеет статический инициализатор, который выглядит следующим образом:
static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};
Этот статический инициализатор вызывается, когда вы используете метод forName . Итак, сами того не осознавая, вы зарегистрировали драйвер MySQL.
Что касается newInstance , я не знаю, почему он там есть. Это кажется ненужным.
Он использует отражение для поиска в classpath класса под названием "com.mysql.jdbc.Driver" и создает его новый экземпляр.
В вашем коде, когда вы пишете
Integer foo = new Integer()
Вместо этого вы можете написать
Integer foo = Class.forName("java.lang.Integer").newInstance()
Но зачем вам все это? Потому что вы хотите загружать драйвер базы данных во время выполнения, а не вставлять его в код. Таким образом, если вы измените базу данных, вы просто измените конфигурационный файл, который загрузит другой драйвер базы данных. В вашем конкретном случае это может не иметь значения, но это открывает новые возможности по конфигурации базы данных (и этот Class.forName jazz - это то, как это обычно делается)
.Загружает драйвер MySQL JDBC.
Причина, по которой вы это делаете, заключается в том, что вы не напрямую используете этот класс, поэтому нет статической привязки к имени класса. Когда вы пытаетесь открыть соединение с базой данных, вы просто используете java.sql.Connection
, а не конкретный класс или интерфейс MySQL. Этот перевод выполняется за кулисами с динамической загрузкой классов.
Вы загружаете этот класс, чтобы он мог зарегистрироваться в подсистеме JDBC, когда вы впоследствии установите соединение.
Его цель - динамически загружать определение класса, заданное полным именем, переданным как строковый аргумент.
Это означает, что JVM будет эффективно искать файл .class
внутри элементов пути к классам, а затем с помощью newInstance ()
вы запрашиваете новый экземпляр этого класса.
Если класс уже был загружен раньше, то он уже находится в кеше и больше не будет извлечен из файла. (не уверен на 100%, возможно, вам разрешено «обновить» определение класса во время выполнения, но лично я думаю, что это приведет к несогласованности)
Вызов Class.forName создает экземпляр вашего драйвера
Вызов Class.forName("X") вызывает динамическую загрузку класса с именем X (во время выполнения).
Когда вы запускаете java-программу, у вас есть путь к классам и местоположение по умолчанию для получения некоторых jar-файлов (содержащих классы) и классов. JVM загрузит все эти jar-файлы (содержащие классы) и классы для подготовки к запуску вашей java-программы.
Class.forName ("className") просматривает все эти загруженные классы, чтобы вернуть конкретное "className", чтобы вы могли создать из него экземпляр / объект.
Это динамический способ сделать то же самое, что и в создании экземпляра объекта во время компиляции :
ClassName classInstance = new ClassName();
Возвращает объект Class, связанный с классом [...] заданным строковым именем
Это означает, что он вернет (или попытается вернуть) класс com.mysql.jdbc.Driver
Позже Class.newInstace()
Создает новый экземпляр класса, представленного этим [...] объектом
Итак, что делает эта строка, так это динамически создает экземпляр mysql Driver.
Это:
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Было бы эквивалентно:
import java.sql.Driver;
....
Driver driver = new com.mysql.jdbc.Driver()
Кстати, согласно DriverManager doc, вам больше не нужно его использовать:
Приложениям больше не нужно явно загружать JDBC драйверы с помощью Class.forName()
Раньше нужно было загружать драйвер, но теперь DriverManager использует другую стратегию.
Наконец, прочитайте:
ПРИМЕЧАНИЕ: Интерфейс DataSource, новый в JDBC 2.0 API, предоставляет еще один способ подключения к источнику данных. Использование объекта DataSource является предпочтительным способом подключения к источнику данных.