获取组件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)
等