Я выглядел как вопрос: Создание экземпляра класса с его строковым именем, который описывает, как создать экземпляр класса, если у него есть имя. Есть ли способ сделать это на 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(...)
с соответствующими исключениями.