Может быть, пример, демонстрирующий, как используются оба метода, поможет вам лучше понять вещи.Итак, рассмотрим следующий класс:
package test;
public class Demo {
public Demo() {
System.out.println("Hi!");
}
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("test.Demo");
Demo demo = (Demo) clazz.newInstance();
}
}
Как объяснено в его javadoc, вызов Class.forName(String)
возвращает объект Class
, связанный с классом или интерфейсом с даннымимя строки т.е. она возвращает test.Demo.class
, которая зависит от переменной clazz
типа Class
.
Затем, вызов clazz.newInstance()
создает новыйэкземпляр класса, представленный этим Class
объектом.Класс создается как бы выражением new
с пустым списком аргументов. Другими словами, здесь это фактически эквивалентно new Demo()
и возвращает новый экземпляр Demo
.
И запуск этого Demo
класса выводит следующий вывод:
Hi!
Большая разница с традиционным new
заключается в том, что newInstance
позволяет создавать экземпляр класса, который вы не знаете до времени выполнения, делая ваш код более динамичным.
Типичным примером является JDBC API, который загружает во время выполнения точный драйвер, необходимый для выполнения работы.Контейнеры EJB, контейнеры сервлетов также являются хорошими примерами: они используют динамическую загрузку во время выполнения для загрузки и создания компонентов, о которых они ничего не знают до выполнения.
На самом деле, если вы хотите пойти дальше, взгляните на Теда.Бумага Ньюарда Понимание Class.forName () , которое я перефразировал в параграфе чуть выше.
РЕДАКТИРОВАТЬ (отвечая на вопрос ОП, опубликованный в виде комментария):Случай с драйверами JDBC немного особенный.Как объяснено в DriverManager главы Начало работы с JDBC API :
(...) Класс Driver
загружен, и, следовательно,автоматически регистрируется с помощью DriverManager
одним из двух способов:
путем вызова метода Class.forName
.Это явно загружает класс драйвера.Так как он не зависит от каких-либо внешних настроек, этот способ загрузки драйвера рекомендуется для использования DriverManager
framework.Следующий код загружает класс acme.db.Driver
:
Class.forName("acme.db.Driver");
Если acme.db.Driver
был написан так, что загрузка вызывает создание экземпляра, а также вызывает DriverManager.registerDriver
с этим экземпляром в качествепараметр (как и должно быть), затем он находится в списке драйверов DriverManager
и доступен для создания соединения.
(...)
В обоих этих случаях недавно загруженный класс Driver
несет ответственность за регистрацию себя путем вызова DriverManager.registerDriver
.Как уже упоминалось, это должно быть сделано автоматически при загрузке класса.
Чтобы зарегистрировать себя во время инициализации, драйвер JDBC обычно использует статический блок инициализации, например:
package acme.db;
public class Driver {
static {
java.sql.DriverManager.registerDriver(new Driver());
}
...
}
Вызов Class.forName("acme.db.Driver")
вызывает инициализацию класса acme.db.Driver
и, таким образом,выполнение статического блока инициализации.И Class.forName("acme.db.Driver")
действительно «создаст» экземпляр, но это всего лишь следствие того, как (хорошо) реализован драйвер JDBC.
В качестве примечания, я бы отметил, что все это больше не требуется приJDBC 4.0 (добавлен как пакет по умолчанию с Java 7) и новая функция автоматической загрузки драйверов JDBC 4.0.См. Усовершенствования JDBC 4.0 в Java SE 6 .