获取组件类型的数组类

时间:2011-02-04 17:39:08

标签: java arrays

如果我有Class的实例,有没有办法为其数组类型获取Class实例?我基本上要求的是等同于方法getArrayType,它是getComponentType()方法的反转,例如:

array.getClass().getComponentType().getArrayType() == array.getClass()

4 个答案:

答案 0 :(得分:48)

我想到的一件事是:

java.lang.reflect.Array.newInstance(componentType, 0).getClass();

但它会创建一个不必要的实例。

不过,这似乎有效:

Class clazz = Class.forName("[L" + componentType.getName() + ";");

这是测试。它会打印true

Integer[] ar = new Integer[1];
Class componentType = ar.getClass().getComponentType();
Class clazz = Class.forName("[L" + componentType.getName() + ";");

System.out.println(clazz == ar.getClass());

The documentation of Class#getName()严格定义数组类名的格式:

  

如果此类对象表示一个数组类,则名称的内部形式由元素类型的名称组成,前面有一个或多个'['表示数组嵌套深度的字符。

Class.forName(..)方法不会直接用于基元 - 对于它们,你必须在名称(int)和数组速记之间创建一个映射 - (I

答案 1 :(得分:12)

实际上由于ClassLoader,原语和多维数组,答案有点复杂:

public static Class<?> getArrayClass(Class<?> componentType) throws ClassNotFoundException{
    ClassLoader classLoader = componentType.getClassLoader();
    String name;
    if(componentType.isArray()){
        // just add a leading "["
        name = "["+componentType.getName();
    }else if(componentType == boolean.class){
        name = "[Z";
    }else if(componentType == byte.class){
        name = "[B";
    }else if(componentType == char.class){
        name = "[C";
    }else if(componentType == double.class){
        name = "[D";
    }else if(componentType == float.class){
        name = "[F";
    }else if(componentType == int.class){
        name = "[I";
    }else if(componentType == long.class){
        name = "[J";
    }else if(componentType == short.class){
        name = "[S";
    }else{
        // must be an object non-array class
        name = "[L"+componentType.getName()+";";
    }
    return classLoader != null ? classLoader.loadClass(name) : Class.forName(name);
}

答案 2 :(得分:7)

您可以执行以下操作

array.getClass() == 
    Array.newInstance(array.getClass().getComponentType(), 0).getClass()

通常,您不需要知道类型,只想创建数组。

答案 3 :(得分:2)

另一种可能的重构是使用通用超类并将两个类对象传递给构造函数。

protected AbstractMetaProperty(Class<T> valueClass, Class<T[]> valueArrayClass) {
  this.valueClass = valueClass;
  this.valueArrayClass = valueArrayClass;
}

然后在子类中:

public IntegerClass() {
  super(Integer.class, Integer[].class);
}

然后在抽象类中,您可以使用valueClass.cast(x)valueArrayClass.isInstance(x)等。