获取组件types的数组类

如果我有一个Class的实例,有没有办法获得它的数组types的Class实例? 我基本上要求的是getArrayType getComponentType()方法的反向方法getArrayType的等价物,例如:

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

有一点想到的是:

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

但它创造了一个不必要的例子。

顺便说一句,这似乎工作:

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

这是testing。 它打印true

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

Class#getName()的文档严格定义了数组类名称的格式:

如果这个类对象表示一个数组类,那么这个名称的内部forms就是由一个或多个代表数组嵌套深度的'['字符前面的元素types名称组成的。

虽然Class.forName(..)方法不会直接用于原语,对于他们,您必须在名称( int )和数组缩写之间创build一个映射 – ( I

实际上,由于ClassLoader ,原语和multidimensional array,答案有点复杂:

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

您可以执行以下操作

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

通常,你不需要知道types,你只是想创build数组。

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

 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)