33

这是一个变量Class<?> cls,现在我想获取另一个Array Class Object是哪个组件类型cls

例如,如果cls= String.class,我想得到String[].class; 如果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();

请问有什么方法可以做到这一点吗?

4

3 回答 3

18

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);
于 2014-12-12T10:53:14.980 回答
10

也许试试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);
于 2012-11-15T06:00:46.277 回答
10

我发现的另一个技巧是在 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();
}
于 2012-11-15T06:35:30.090 回答