В чем разница между новым оператором и Class.newInstance ()? - PullRequest
29 голосов
/ 06 января 2011

В чем разница между оператором new и Class.forName(...).newInstance()?Они оба создают экземпляры класса, и я не уверен, в чем разница между ними.

Ответы [ 10 ]

47 голосов
/ 06 января 2011

Оператор new создает новый объект статически известного типа (во время компиляции) и может вызывать любой конструктор объекта, который вы пытаетесь создать. Это предпочтительный способ создания объекта - он быстрый, и JVM проводит на нем много агрессивных оптимизаций.

Class.forName().newInstance() - это динамическая конструкция, которая ищет класс с определенным именем. Это медленнее, чем использование new, потому что тип объекта не может быть жестко закодирован в байт-код, и потому что JVM, возможно, придется выполнять проверку разрешений, чтобы убедиться, что у вас есть полномочия на создание объекта. Это также частично небезопасно, потому что он всегда использует конструктор с нулевым аргументом, и если объект, который вы пытаетесь создать, не имеет нулевого конструктора, он генерирует исключение.

Короче говоря, используйте new, если вы знаете во время компиляции, какой тип объекта вы хотите создать. Используйте Class.forName().newInstance(), если вы не знаете, какой тип объекта вы будете делать.

11 голосов
/ 06 января 2011

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

Представьте себе сценарий, в котором классы загружаются динамически из удаленного источника. Вы будете знать их имена, но не сможете импортировать их во время компиляции. В этом случае вы не можете использовать new для создания новых экземпляров. Это (одна из причин), почему Java предлагает метод newInstance().

5 голосов
/ 06 января 2011

Class.forName может вызывать только конструктор по умолчанию (без параметров), и имя класса может быть предоставлено во время выполнения, например, имя db-драйвера, считанное из файла конфигурации.

3 голосов
/ 30 декабря 2015

Class.forName("your class name").newInstance() используется, когда вы хотите получить экземпляр из класса, похожий на new, но это полезно, когда вы хотите получить экземпляр из класса в jar-файле или на удаленном сервере, и вы не может импортировать его во время компиляции.

Например: Class.forName("YOUR JDBC DRIVER").newInstance(), вы не можете импортировать класс JDBC во время компиляции.

3 голосов
/ 10 мая 2013

Основное отличие состоит в том, что Class.forName('your class name').newInstance() является динамическим, поскольку нет необходимости жестко кодировать тип в коде.

2 голосов
/ 06 января 2011

Class.forName('myClass').newInstance() загружает класс, если еще не загружен.Здесь он вызывает начальный конструктор и выполняет только статическую часть конструктора.

Оператор new используется для инициализации новых объектов.

Вы можете создать множество экземпляров как с помощью оператора new, так и с разницей Class.forName() во второй раз, когда вы создаете newInstance() статические блоки не будут инициализированы.

Хорошим примером Class.forName('myClass).newInstance() является драйвер JDBC

Class.forName("com.mysql.JDBC.Driver").newInstance()
1 голос
/ 06 января 2011

Class.forName выполнит поиск, чтобы найти объект Class для YourClass.

Использование оператора new должно совпадать с YourClass.class.newInstance().

0 голосов
/ 13 октября 2017

Предположим, com.statckoverflow.Test

Class.forName - он загрузит класс Test и вернет объект класса Class, который содержит метаданные класса Test, такие как имя, пакет, конструктор, аннотации, методы,fields.

newInstance() - Используется для создания новых объектов с использованием Java Reflection.Конструктор с нулевым внутренним параметром будет вызываться в классе Test.Это означает, что объект класса Class создаст объект класса Test, вызвав конструктор с нулевым параметром. Мы можем использовать отражение для деталей класса Test.Как и конструкторы, методы и т. Д.

new оператор - Создает новый объект для класса, создает экземпляр Class и может вызывать их конструкторы.

0 голосов
/ 09 мая 2013

Если у объекта нет нулевого аргумента конструктора, он также создаст объект и не выдаст никаких исключений, пожалуйста, найдите приведенные ниже фрагменты кода.

try {
    Class o = Class.forName("com.myCompany.MyClass");

    Constructor m = o.getConstructor(Integer.class,String.class);
    m.newInstance(new Integer(0),new String(""));

} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
0 голосов
/ 06 января 2011

Хотя оба метода фактически выполняют одно и то же, вы должны использовать оператор new вместо Class.forName ('class'). GetInstance (). Последний использует API отражения для поиска класса во время выполнения. Используя оператор new, виртуальная машина будет заранее знать, что вы хотите использовать этот класс, и, следовательно, быть более эффективной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...