about java: get `String[].class` from `String.class`, what if `String.class` is a "runtime type"?

29,532

Solution 1

Maybe try Class.forName(String)?

Edit: Here is a code snippet.

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);

Solution 2

HRgiger's answer improved:

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

Both of them instantiate an array object when invoked. To get the array type, use

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

Solution 3

Another trick I found is using varargs on util method.

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();
}
Share:
29,532
watchzerg
Author by

watchzerg

Updated on September 30, 2020

Comments

  • watchzerg
    watchzerg over 3 years

    Here is a variable Class<?> cls, now I want to get another Array Class Object which component type is cls.

    For example, if cls=String.class , I want to get String[].class; if cls=int.class, I want to get int[].class, what should I do?

    You see, It's quite easy to get String.class from String[].class:

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

    But I cannot find easy way to do the reverse.

    Here is one possible solution:

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

    Is there any batter way to do this please?