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


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

8 76

8 ответов:

два варианта:

метод 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 объект и вызов a newInstance() метод на этом объекте:

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

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

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

использовать класса.forName("имя класса").newInstance ();

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

это вызовет класс с именем инициализированный.

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

использовать отражение 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);
         }
      }
   }

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

класса.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();