Подтвердить что ты не робот

В чем разница между новым оператором и Class.newInstance()?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Class.forName("com.mysql.JDBC.Driver").newInstance()

Ответ 7

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

Использование нового оператора должно быть таким же, как YourClass.class.newInstance().

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

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();
}