Вопрос-ответ

Creating an instance using the class name and calling constructor

Создание экземпляра с использованием имени класса и вызов конструктора

Есть ли способ создать экземпляр определенного класса с заданным именем класса (dynamic) и передать параметры его конструктору.

Что-то вроде:

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

Где "MyAttributeValue" является аргументом конструктора MyClass.

Переведено автоматически
Ответ 1

Да, что-то вроде:

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

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

Обратите внимание, что имя класса должно быть полным, т. Е. Включать пространство имен. Для вложенных классов вам нужно использовать доллар (поскольку это то, что использует компилятор). Например:

package foo;

public class Outer
{
public static class Nested {}
}

Чтобы получить Class объект для этого, вам понадобится Class.forName("foo.Outer$Nested").

Ответ 2

Вы можете использовать Class.forName() для получения Class объекта нужного класса.

Затем используйте getConstructor() для поиска нужного Constructor объекта.

Наконец, вызовите newInstance() для этого объекта, чтобы получить ваш новый экземпляр.

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");
Ответ 3

Вы можете использовать отражения

return Class.forName(className).getConstructor(String.class).newInstance(arg);
Ответ 4

Если класс имеет только один пустой конструктор (например, Activity или Fragment и т.д., классы Android):

Class<?> myClass = Class.forName("com.example.MyClass");    
Constructor<?> constructor = myClass.getConstructors()[0];
java reflection