Когда мы создаем instace класса с помощью нового оператора, он делает две вещи
- загрузить класс в памяти, если он не загружен - , что означает создание в памяти представление класса из файла .class, чтобы экземпляр мог быть создан из него. Это включает инициализацию статических переменных (разрешение этого класса)
- создать экземпляр этого класса и сохранить ссылку на переменную.
Class.forName
делает только первое место. Он загружает класс в память и возвращает эту ссылку как экземпляр класса. Если мы хотим создать экземпляр, тогда мы можем вызвать метод newInstance этого класса. который будет вызывать конструктор по умолчанию (без конструктора аргументов). Обратите внимание, что если конструктор по умолчанию недоступен, то метод newInstance будет вызывать IllegalAccessException
. и если класс является абстрактным классом или интерфейсом или у него нет конструктора по умолчанию, тогда он будет вызывать InstantiationException
. Если какое-либо исключение возбуждается при разрешении этого класса, оно выдает ExceptionInInitializerError
.
Если конструктор по умолчанию не определен, мы должны вызвать конструктор defiend с использованием API отражения.
Но главное преимущество с Class.forName заключается в том, что оно может принимать имя класса как аргумент String. Таким образом, мы можем передавать имя класса динамически. Но если мы создадим экземпляр класса с использованием нового оператора, имя класса не может быть изменено динамически.
Class.forName()
inturn вызовет метод loadClass вызывающего класса ClassLoader (классLode класса, из которого вызывается Class.forName
).
По умолчанию Class.forName()
разрешает этот класс. что означает, инициализировать все статические переменные внутри этого класса. то же самое может быть изменено с помощью перегруженного метода Class.forName(String name,boolean initialize,ClassLoader loader)
Основной причиной для водителя загрузки с использованием JDBC Class.forName()
это, водитель может динамически изменяться. в статическом блоке все Драйверы создадут экземпляр самого себя и зарегистрируют этот класс с помощью DriverManager с использованием метода DriverManager.registerDriver()
. Поскольку по умолчанию разрешает класс, он инициализирует статический инициализатор. Так что, когда мы называем Class.forName("com.sun.jdbc.odbc.JdbcOdbcDriver")
, класса Driver будет загружен, инстанциированы и регистры с DriverManager
Так что, если вы используете новый оператор вы должны сделать следующие вещи.
Код:
Driver drv = new com.sun.jdbc.odbc.JdbcOdbcDriver();
DriverManager.registerDriver(drv);
Также см http://stackoverflow.com/a/8053125/632951 – Pacerier