Есть ли способ создать экземпляр класса по имени в Java?
Я смотрел как вопрос: Создать экземпляр класса из его строкового имени, которое описывает, как создать экземпляр класса при наличии его имени. Есть ли способ сделать это в Java? У меня будет имя пакета и имя класса, и мне нужно иметь возможность создать объект, имеющий это конкретное имя.
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
объект и вызов anewInstance()
метод на этом объекте:Class<?> clazz = Class.forName("com.foo.MyClass"); Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class); Object instance = constructor.newInstance("stringparam", 42);
оба метода, известного как отражение. Вы, как правило, должны поймать различные исключения, которые могут произойти, в том числе такие вещи, как:
- JVM не может найти или не может загрузить ваш класс
- класс, который вы пытаетесь создать, не имеет правильного вида конструкторы
- сам конструктор выдал исключение
- конструктор, который вы пытаетесь вызвать, не является публичным
- установлен менеджер безопасности, который предотвращает отражение
использовать класса.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();