Есть ли способ создать экземпляр classа по имени в Java?

Я рассматривал вопрос: Создайте class из его имени строки, который описывает, как создать экземпляр classа при его имени. Есть ли способ сделать это на Java? У меня будет имя пакета и имя classа, и мне нужно будет создать объект с таким именем.

Два пути:

Метод 1 – только для classов, имеющих конструктор no-arg

Если у вашего classа нет конструктора no-arg, вы можете получить объект Class с помощью Class Class.forName() и использовать метод newInstance() для создания экземпляра (хотя будьте осторожны, что этот метод часто считается злым, потому что он может победить проверенные исключения Java ).

Например:

 Class clazz = Class.forName("java.util.Date"); Object date = clazz.newInstance(); 

Способ 2

Альтернативный безопасный подход, который также работает, если class не имеет каких-либо конструкторов no-arg, должен запросить ваш объект classа, чтобы получить его объект Constructor и вызвать метод newInstance() для этого объекта:

 Class clazz = Class.forName("com.foo.MyClass"); Constructor constructor = clazz.getConstructor(String.class, Integer.class); Object instance = constructor.newInstance("stringparam", 42); 

Оба метода известны как reflection . Вы, как правило, должны поймать различные исключения, которые могут произойти, включая такие вещи, как:

  • JVM не может найти или не может загрузить ваш class
  • class, который вы пытаетесь создать, не имеет правильного типа конструкторов
  • сам конструктор бросил исключение
  • конструктор, который вы пытаетесь вызвать, не является общедоступным
  • был установлен диспетчер безопасности и предотвращает возникновение
 MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance(); 

используйте Class.forName (“String name of class”). newInstance ();

 Class.forName("A").newInstance(); 

Это приведет к инициализации classа с именем A.

Чтобы упростить получение полного имени classа, чтобы создать экземпляр, используя Class.forName(...) , можно использовать метод Class.getName() . Что-то вроде:

 class ObjectMaker { // Constructor, fields, initialization, etc... public Object makeObject(Class clazz) { Object o = null; try { o = Class.forName(clazz.getName()).newInstance(); } catch (ClassNotFoundException e) { // There may be other exceptions to throw here, // but I'm writing this from memory. e.printStackTrace(); } return o; } } 

Затем вы можете отбросить объект, который вы возвращаете, в любой class, который вы передаете makeObject(...) :

 Data d = (Data) objectMaker.makeObject(Data.class); 

Использовать java-reflection

Создание новых объектов Нет эквивалента вызову метода для конструкторов, потому что вызов конструктора эквивалентен созданию нового объекта (точнее, создания нового объекта связано как с распределением памяти, так и с построением объекта). Итак, ближайший эквивалент предыдущего примера должен сказать:

 import java.lang.reflect.*; public class constructor2 { public constructor2() { } public constructor2(int a, int b) { System.out.println( "a = " + a + " b = " + b); } public static void main(String args[]) { try { Class cls = Class.forName("constructor2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Constructor ct = cls.getConstructor(partypes); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = ct.newInstance(arglist); } catch (Throwable e) { System.err.println(e); } } } 

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

Class.forName («ClassName») решит вашу цель.

 Class class1 = Class.forName(ClassName); Object object1 = class1.newInstance(); 
 String str = (String)Class.forName("java.lang.String").newInstance(); 

что-то вроде этого должно работать …

 String name = "Test2";//Name of the class Class myClass = Class.forName(name); Object o = myClass.newInstance(); 
  • Должен ли я использовать это ключевое слово, когда я хочу ссылаться на переменные экземпляра внутри метода?
  • Шаблон для ленивого streamобезопасного создания одноэлементов в java
  • Создание экземпляра Generic с переменной, содержащей тип
  • Interesting Posts

    Отключите Mozilla Firefox, предупреждая о появлении новых надстроек Firefox

    формат в файле строковых ресурсов

    Имя не существует в ошибке пространства имен в XAML

    Regex соответствует всем после вопросительного знака?

    Как работает функция Distinct () в Spark?

    Как получить счет текущего месяца в воскресенье в psql?

    Есть ли способ узнать, какое приложение использует большую часть полосы пропускания в Linux?

    Есть ли способ, чтобы Windows 7 отображала оставшееся место на диске в строке состояния?

    Ошибка13 в Excel VBA в файле данных

    Как реализовать динамический список с составным компонентом JSF 2.0?

    Кто владеет всеми доменами?

    Для логического поля, каково соглашение об именах для его получателя / сеттера?

    Какое свободное программное обеспечение можно использовать для сканирования сканированных изображений

    Получить выбранный элемент с помощью флажка в Listview

    Воспроизведение видеофайлов в медиаплеере VLC из-за базовых URL-адресов аутентификации HTTP без пароля

    Давайте будем гением компьютера.