Я смотрел как вопрос: создать экземпляр класса из его строкового имени, которое описывает, как создать экземпляр класса, имея его имя. Есть ли способ сделать это на Java? У меня будет имя пакета и имя класса, и мне нужно иметь возможность создать объект с этим конкретным именем.
java
string
object
instantiation
ict1991
источник
источник
Ответы:
Два пути:
Метод 1 - только для классов, имеющих конструктор без аргументов
Если в вашем классе есть конструктор без аргументов, вы можете получить
Class
объект, используяClass.forName()
и использовать этотnewInstance()
метод для создания экземпляра (хотя имейте в виду, что этот метод часто считается злом, поскольку он может победить проверенные исключения Java).Например:
Способ 2
Альтернативный более безопасный подход, который также работает, если класс не имеет конструкторов без аргументов, - запросить объект вашего класса, чтобы получить его
Constructor
объект, и вызватьnewInstance()
метод этого объекта:Оба метода известны как отражение . Как правило, вам придется перехватить различные исключения, которые могут произойти, в том числе такие, как:
источник
newInstance()
, можем ли мы вернуть его нашему собственному объекту?instance
вcom.foo.MyClass
? учитывая, что com.foo.MyClass - это просто строкаисточник
используйте Class.forName («Строковое имя класса»). newInstance ();
Это вызовет инициализацию класса с именем A.
источник
Чтобы упростить получение полного имени класса для создания экземпляра с помощью
Class.forName(...)
, можно использоватьClass.getName()
метод. Что-то вроде:Затем вы можете привести объект, который вы получили, к любому классу, которому вы передали
makeObject(...)
:источник
clazz.newInstance()
вместо «getName
тогда»fromName
?Использовать отражение Java
Создание новых объектов. Нет эквивалента вызову метода для конструкторов, потому что вызов конструктора эквивалентен созданию нового объекта (чтобы быть наиболее точным, создание нового объекта включает как выделение памяти, так и создание объекта). Таким образом, ближайший эквивалент предыдущему примеру:
который находит конструктор, который обрабатывает указанные типы параметров, и вызывает его для создания нового экземпляра объекта. Ценность этого подхода в том, что он чисто динамический, с поиском и вызовом конструктора во время выполнения, а не во время компиляции.
источник
Class.forName ("ClassName") решит вашу задачу.
источник
источник
что-то вроде этого должно работать ...
источник
Прямое использование
newInstance()
устарело, начиная с Java 8. Вам необходимо использоватьClass.getDeclaredConstructor(...).newInstance(...)
с соответствующими исключениями.источник