2009-12-25 4 views
1

У меня есть строка с именем класса, есть способ (писать на Java), чтобы использовать эту строку при создании нового экземпляра этого класса, чтобы сделать что-то вроде это:
объект obj = новые данныеInString.
Итак, dataInString анализируется из строки.Способ использования строки для создания новых классов

ответ

5

Вы имеете в виду что-то вроде Class.forName(String)? Цитирование javadoc метода:

Возвращает объект Class, связанный с классом или интерфейсом с заданным именем строки. Вызов этого метода эквивалентно:

Class.forName(className, true, currentLoader) 

где currentLoader обозначает определяющий загрузчик классов текущего класса.

Например, следующий фрагмент кода возвращает дескриптор выполнения Class для класса с именем java.lang.Thread:

Class t = Class.forName("java.lang.Thread") 

Вызов forName("X") вызывает класс с именем X для инициализации.

А затем вызовите Class#newInstance() на возвращенном Class (он должен иметь пустой конструктор).

Создает новый экземпляр класса, представленного этим объектом Class. Класс создается таким образом, как если бы выражение new с пустым списком аргументов. Класс инициализируется, если он еще не был инициализирован.

0

Использование отражений для создания объектов. Простой класс.forName («com.blah.blah») должен стать хорошей отправной точкой для поиска дополнительной информации об отражениях.

4

Предполагая, что класс имеет конструктор не-арг, то следующий должен сделать трюк

Class<?> clazz = Class.forName("someclass"); 
Object obj = clazz.newInstance(); 

Если вам нужно создать объект, используя другой конструктор, то вам нужно будет сделать что-то как это:

Constructor<?> ctor = clazz.getConstructor(ArgClass.class, Integer.TYPE); 
Object obj = ctor.newInstance(arg, Integer.valueOf(42)); 

Есть целый ряд проверяемых исключений, которые должны быть обработаны в любом случае ...

+1

Я думаю, вы имели в виду Integer.TYPE вместо Integer.CLASS. Кроме того, я бы рекомендовал против нового Integer (...) при использовании Java 1.5 или выше (поскольку вы используете varargs, это было бы так): либо полагаться на автобоксинг, либо использовать Integer.valueOf (...) - это избегает создания новых объектов для часто используемых экземпляров. –

+0

Спасибо .... исправлено –

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