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

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

Ответ 1

Два способа:

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

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

Например:

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

Метод 2

Альтернативный более безопасный подход, который также работает, если класс не имеет никаких конструкторов no-arg, должен запросить ваш объект класса, чтобы получить его объект 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 не может найти или не может загрузить ваш класс
  • класс, который вы пытаетесь создать, не имеет подходящего типа конструкторов
  • сам конструктор исключил исключение
  • конструктор, который вы пытаетесь вызвать, не является общедоступным.
  • был установлен диспетчер безопасности и предотвращает его отражение

Ответ 2

MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();

Ответ 3

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

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

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

Ответ 4

Чтобы упростить получение полного имени класса для создания экземпляра с помощью 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;
    }
}

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

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

Ответ 5

Использовать отражение java

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

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);
         }
      }
   }

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

Ответ 6

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

Class class1 = Class.forName(ClassName);
Object object1 = class1.newInstance();

Ответ 7

String str = (String)Class.forName("java.lang.String").newInstance();

Ответ 8

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

String name = "Test2";//Name of the class
        Class myClass = Class.forName(name);
        Object o = myClass.newInstance();

Ответ 9

Использование newInstance() напрямую устарело с Java 8. Вам необходимо использовать Class.getDeclaredConstructor(...).newInstance(...) с соответствующими исключениями.