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

Передать тип класса в качестве параметра и создать его экземпляр

Я хочу передать тип класса в качестве параметра методу в java.all, который имеет тот же параметр конструктора. И создать экземпляр этого класса в этом методе. Это возможно?

Обновление через несколько лет: сделайте заказ Сапнеш-Найк, ответ на этот вопрос, похоже, самый актуальный. Я не принял это как ответ, так как у меня нет работающего стека Java.
PS: Дайте мне крик, если вы можете проверить.

4b9b3361

Ответ 1

Использование отражения для создания экземпляра:

Object obj = clazz.newInstance();

Для создания экземпляра будет использоваться конструктор no-arg по умолчанию.

Constructor<?> constructor = clazz.getConstructor(String.class);
Object object = constructor.newInstance(new Object[] { strArgument });

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

Ответ 2

Для этого нужно использовать рефлексию, но, конечно, это возможно.

void MyMethod(Class className)
{
    try {
        Object obj = className.newInstance();
        //obj is a newly created object of the passed in type
    }
    catch (Exception ex) { }
}

Ответ 3

Вы ищете отражение.

Ваш метод будет выглядеть примерно так:

public void m1(Class c) {

      try {
        Object obj = c.newInstance();
        //do something with your new instance
    } catch (InstantiationException ex) {

    } catch (IllegalAccessException ex) {

    }
}

Документ Oracle для API Reflection здесь

Ответ 4

Да, вы можете

void x(Class cls) throws InstantiationException, IllegalAccessException {
    cls.newInstance();
}

Обратите внимание, что Class.newInstance может завершиться неудачей с помощью

IllegalAccessException - если класс или его нулевой конструктор недоступен.

InstantationException - если этот класс представляет абстрактный класс, интерфейс, класс массива, примитивный тип или void; или если класс не имеет нулевого конструктора; или если экземпляр не работает по другой причине.

см. API для более

Ответ 5

clazz.newInstance().

Этот метод распространяет любое исключение, выданное нулевым конструктором, включая проверенное исключение. Использование этого метода эффективно обходит проверку исключений во время компиляции, которая в противном случае выполнялась бы компилятором. Метод Constructor.newInstance позволяет избежать этой проблемы, помещая любое исключение, сгенерированное конструктором, в (проверенный) java.lang.reflect.InvocationTargetException.

Вызов:

clazz.newInstance()

можно заменить на:

clazz.getDeclaredConstructor().newInstance()

Пример:

void MyMethod(Class type) throws InstantiationException, IllegalAccessException {
    type.getDeclaredConstructor().newInstance();
}