2009-09-17 2 views
26

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

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

EDIT: Что касается первых ответов на это:

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

Would

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

возвращение MyClass.class?

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

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

ответ

45

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

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

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

Object obj = c.newInstance(); 

EDIT: Это просто самый простой случай использования. Как указано в комментариях, вам нужно будет рассмотреть аргументы конструктора и исключения, вызванные процессом инициализации. У JavaDocs for newInstance есть все подробности.

+0

Class.newInstance делает зло с исключениями. –

+1

Да. Вам нужно будет обрабатывать любые исключения инициализации. –

+2

Чтобы это сработало, класс должен иметь доступный конструктор no-args. – Jesper

7
Class.forName("MyClass") 

Читать the JavaDoc Подробности

+0

Если вы не хотите инициализировать класс, вам нужна форма с тремя аргументами. –

2

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

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); 
    } 
+0

Это не будет работать, если один из аргументов является подклассом или реализацией типа, который хочет конструктор. – ColinD

Смежные вопросы