Как получить объект класса из имени класса в Java - PullRequest
34 голосов
/ 17 сентября 2009

Я знаю имя класса, скажем "MyClass" и хочу получить объект Class, т.е. MyClass.class для будущих ссылок. Есть ли способ сделать это?

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

РЕДАКТИРОВАТЬ: Относительно первых ответов на это:

Я уже проверил метод forName(), но подумал, что он должен также инициализировать класс. Теперь я могу назвать его с полными аргументами и передать false второму аргументу, но третий должен быть null или как?

Будет

Class.forName("MyClass", false, null);

возврат MyClass.class?

Фактически, я хочу заменить массив идентификаторов String, связанных с Class объектами, на массив идентификаторов, из которых объекты класса извлекаются автоматически, чтобы избавиться от некоторой ручной работы:)

Спасибо за быстрые ответы и извините за то, что не упомянули об этом раньше.

Ответы [ 4 ]

50 голосов
/ 17 сентября 2009

Вы можете использовать:

Class c = Class.forName("com.package.MyClass");

И позже создать экземпляр объекта:

Object obj = c.newInstance();

РЕДАКТИРОВАТЬ: Это просто простейший вариант использования. Как указано в комментариях, вам нужно будет учитывать аргументы конструктора и исключения, возникающие в процессе инициализации. JavaDocs для newInstance содержит все детали.

7 голосов
/ 17 сентября 2009
Class.forName("MyClass")

Читайте JavaDoc для подробностей

3 голосов
/ 17 сентября 2009

Похоже, вы можете использовать Class класс статический forName метод .

2 голосов
/ 17 сентября 2009

Стоит также отметить, что приведенные выше предложения верны, но будут работать только для конструкторов по умолчанию (без параметров). Вы также можете сделать что-то вроде:

    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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...