В Java, соединяясь с mysql, каково значение Class.forName?

Какова цель этой строки?
Это не возвращает значение или установить состояние существующего класса/объекта (или это?)

Class.forName ("com.mysql.jdbc.Driver").newInstance ();
5
задан Itay Moav -Malimovka 15 July 2010 в 01:15
поделиться

8 ответов

Почти наверняка com.mysql.jdbc.Driver имеет статический инициализатор, который выглядит следующим образом:

static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};

Этот статический инициализатор вызывается, когда вы используете метод forName . Итак, сами того не осознавая, вы зарегистрировали драйвер MySQL.

Что касается newInstance , я не знаю, почему он там есть. Это кажется ненужным.

7
ответ дан 18 December 2019 в 07:08
поделиться

Он использует отражение для поиска в classpath класса под названием "com.mysql.jdbc.Driver" и создает его новый экземпляр.

В вашем коде, когда вы пишете

Integer foo = new Integer()

Вместо этого вы можете написать

Integer foo = Class.forName("java.lang.Integer").newInstance()

Но зачем вам все это? Потому что вы хотите загружать драйвер базы данных во время выполнения, а не вставлять его в код. Таким образом, если вы измените базу данных, вы просто измените конфигурационный файл, который загрузит другой драйвер базы данных. В вашем конкретном случае это может не иметь значения, но это открывает новые возможности по конфигурации базы данных (и этот Class.forName jazz - это то, как это обычно делается)

.
8
ответ дан 18 December 2019 в 07:08
поделиться

Загружает драйвер MySQL JDBC.

Причина, по которой вы это делаете, заключается в том, что вы не напрямую используете этот класс, поэтому нет статической привязки к имени класса. Когда вы пытаетесь открыть соединение с базой данных, вы просто используете java.sql.Connection , а не конкретный класс или интерфейс MySQL. Этот перевод выполняется за кулисами с динамической загрузкой классов.

Вы загружаете этот класс, чтобы он мог зарегистрироваться в подсистеме JDBC, когда вы впоследствии установите соединение.

3
ответ дан 18 December 2019 в 07:08
поделиться

Его цель - динамически загружать определение класса, заданное полным именем, переданным как строковый аргумент.

Это означает, что JVM будет эффективно искать файл .class внутри элементов пути к классам, а затем с помощью newInstance () вы запрашиваете новый экземпляр этого класса.

Если класс уже был загружен раньше, то он уже находится в кеше и больше не будет извлечен из файла. (не уверен на 100%, возможно, вам разрешено «обновить» определение класса во время выполнения, но лично я думаю, что это приведет к несогласованности)

1
ответ дан 18 December 2019 в 07:08
поделиться
1
ответ дан 18 December 2019 в 07:08
поделиться

Вызов Class.forName("X") вызывает динамическую загрузку класса с именем X (во время выполнения).

1
ответ дан 18 December 2019 в 07:08
поделиться

Когда вы запускаете java-программу, у вас есть путь к классам и местоположение по умолчанию для получения некоторых jar-файлов (содержащих классы) и классов. JVM загрузит все эти jar-файлы (содержащие классы) и классы для подготовки к запуску вашей java-программы.

Class.forName ("className") просматривает все эти загруженные классы, чтобы вернуть конкретное "className", чтобы вы могли создать из него экземпляр / объект.

Это динамический способ сделать то же самое, что и в создании экземпляра объекта во время компиляции :

ClassName classInstance = new ClassName();
1
ответ дан 18 December 2019 в 07:08
поделиться

Class.forName(String name)

Возвращает объект 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 является предпочтительным способом подключения к источнику данных.

-1
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: