Подтвердить что ты не робот

О java: get `String []. class` из` String.class`, что, если `String.class` - это "тип времени выполнения"?

Вот переменная Class<?> cls, теперь я хочу получить еще один Array Class Object, тип компонента которого cls.

Например, если cls= String.class, я хочу получить String[].class; if cls= int.class, я хочу получить int[].class, что мне делать?

Понимаете, довольно легко получить String.class от String[].class:

Class<?> arrayCls = String[].class;
if(arrayCls.isArray()){
    Class<?> cls = arrayCls.getComponentType();
}

Но я не могу найти простой способ сделать обратное.

Вот одно из возможных решений:

Class<?> clazz = String.class;
Class<?> arrayClass = Array.newInstance(clazz,0).getClass();

Есть ли какой-нибудь способ, чтобы сделать это, пожалуйста?

4b9b3361

Ответ 1

Может быть, попробуйте Class.forName(String)?

Изменить: Вот фрагмент кода.

Class<?> arrayClass = String[].class;
System.out.println(arrayClass);
Class<?> namedClass = Class.forName("[L" + String.class.getName() + ";");
System.out.println(namedClass);
System.out.println(arrayClass == namedClass);

Ответ 2

Другим трюком, который я нашел, является использование varargs для метода util.

public static void main(String[] args) throws ClassNotFoundException {

    Class<?> demo = Main.<String>getArrayClass();
    System.out.println(demo);
}

static <T> Class getArrayClass(T... param){
    return param.getClass();
}

Ответ 3

Улучшен ответ HRgiger:

@SuppressWarnings("unchecked")
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) {
    return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass();
}

Оба они создают экземпляр объекта массива при вызове. Чтобы получить тип массива, используйте

Class<?> childType = ...;
Class<?> arrayType = getArrayClass(childType);