Как получить объект класса из имени класса в Java
Я знаю имя класса, скажу "MyClass" и хочу получить объект Class
, т.е. MyClass.class для будущих ссылок. Есть ли способ сделать это?
Я просмотрел веб-страницы, но большинство вещей, которые я нашел в связи с этим, касались ClassLoader
, которые, как я полагаю, не подходят для моего случая. Я не хочу инициализировать класс, но получаю только объект класса для использования в будущем.
EDIT: Что касается первых ответов на это:
Я уже проверил метод forName()
, но я думал, что предполагается также инициализировать класс. Теперь я могу вызвать его с полными аргументами и передать false
во второй аргумент, но третий должен быть null
или что?
Would
Class.forName("MyClass", false, null);
return MyClass.class
?
Фактически, то, что я хочу сделать, заменяет массив идентификаторов строк, связанных с объектами Class
, с массивом идентификаторов, из которых автоматически создаются объекты класса, чтобы избавиться от некоторой ручной работы:)
Спасибо за быстрые ответы и жаль, что не упоминал об этом раньше.
Ответы
Ответ 1
Вы можете использовать:
Class c = Class.forName("com.package.MyClass");
И позже создайте экземпляр объекта:
Object obj = c.newInstance();
EDIT: Это самый простой вариант использования. Как указано в комментариях, вам нужно будет рассмотреть аргументы конструктора и исключения, вызванные процессом инициализации. JavaDocs для newInstance
содержит все подробности.
Ответ 2
Class.forName("MyClass")
Подробнее читайте JavaDoc
Ответ 3
Похоже, вы могли бы использовать Class
class static forName
.
Ответ 4
Также стоит отметить, что приведенные выше предложения верны, но будут работать только для конструкторов по умолчанию (без параметров). Вы также можете сделать что-то вроде:
public Object newInstance(String className, Object...args) throws Exception {
Class<?> clazz = Class.forName(className);
if(args == null || args.length == 0) {
return clazz.newInstance();
}
List<Class<?>> argTypes = new ArrayList<Class<?>>();
for(Object object : args) {
argTypes.add(object.getClass());
}
Constructor<?> explicitConstructor = clazz.getConstructor(argTypes.toArray(new Class[argTypes.size()]));
return explicitConstructor.newInstance(args);
}