Передать тип класса в качестве параметра и создать его экземпляр
Я хочу передать тип класса в качестве параметра методу в java.all, который имеет тот же параметр конструктора. И создать экземпляр этого класса в этом методе. Это возможно?
Обновление через несколько лет: сделайте заказ Сапнеш-Найк, ответ на этот вопрос, похоже, самый актуальный. Я не принял это как ответ, так как у меня нет работающего стека Java.
PS: Дайте мне крик, если вы можете проверить.
Ответы
Ответ 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();
}