Создайте статический массив, используя Class.forName

В Android есть необъявленный (скрытый) класс с именем «android.graphics.FontFamily», и я хочу создать его статический массив. Что-то вроде этого:

Class<?> clazz = Class.forName("android.graphics.FontFamily"); // Ok.
Class<?> clazz_array = Class.forName("android.graphics.FontFamily[]"); // Method threw 'java.lang.ClassNotFoundException' exception.

Чтобы построить этот гипотетический код:

FontFamily[] families = {fontFamily};

Как мне это сделать?

Спасибо.


person mh taqia    schedule 05.06.2016    source источник
comment
Что означает необъявленный (скрытый) класс? Это означает private, nested static private или inner private?   -  person Giorgio Antonioli    schedule 05.06.2016
comment
см. Array.newInstance, документацию   -  person pskink    schedule 05.06.2016
comment
@pskink Если я правильно понял, массив не объявлен в этом классе, он просто хочет создать массив этого частного класса.   -  person Giorgio Antonioli    schedule 05.06.2016
comment
@Fondesa, да, he simply wants to create an array of that hidden class   -  person pskink    schedule 05.06.2016


Ответы (2)


Вы должны иметь возможность создать массив с отражением, а затем получить его класс. Пример:

Class <?> clazz = Class.forName("android.graphics.FontFamily");
Object fontFamily = clazz.newInstance();
Object families = Array.newInstance(clazz, 1);
Array.set(families, 0, fontFamily);
person bcsb1001    schedule 05.06.2016
comment
Хорошо, clazzArray — это класс, и как я могу создать его экземпляр, который имеет 1 элемент (например, семейства FontFamily[] = {fontFamily})? - person mh taqia; 05.06.2016
comment
@mhtaqia см. java.lang.reflect.Array документацию - person pskink; 05.06.2016

Вы должны указать полное имя, как указано в Class документации. Итак, в вашем случае это будет:

Class<?> clazzArray = Class.forName("[Landroid.graphics.FontFamily;");

[ указывает на массив, а префикс L и суффикс с точкой с запятой указывают на то, что часть в середине является именем класса.

person Jon Skeet    schedule 05.06.2016
comment
Спасибо, отличный ответ. - person mh taqia; 05.06.2016