java.lang.reflect包中的Array类允许动态地创建数组,今天我所操作的是扩大任意类型的数组的长度.其中最关键的是Array类中的静态方法newInstance,它能够构造新数组。在调用它时必须提供两个参数,一个是数组的元素类型,一个是数组的长度。下面我们直接上代码演示:
int [] a ={1,2,3};
a=(int[])goodArrayGrow(a);
arrayPrint(a);
String [] b ={"Tom","Dick","Harry"};
b=(String[])goodArrayGrow(b);
arrayPrint(b);
System.out.println("The following call will generate an exception.");
b = (String[]) badArrayGrow(b);//字符串数组类型String[]可以转换成Object,但不能转换成对象数组。
//会报java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
static Object goodArrayGrow(Object a) {
Class cl = a.getClass();
if(!cl.isArray()) return null;
Class componentType = cl.getComponentType();
int length = Array.getLength(a);
int newLength = length*11/10+10;
Object newArray =Array.newInstance(componentType, newLength);
System.arraycopy(a, 0, newArray,0 , length);
return newArray;
}
static Object[] badArrayGrow(Object[] a) {
int newLength = a.length*11/10+10;
Object[] newArray = new Object[newLength];
System.arraycopy(a, 0, newArray, 0, a.length);
return newArray;
}
static void arrayPrint(Object a) {
Class cl = a.getClass();
if(!cl.isArray()) return ;
Class componentType = cl.getComponentType();
int length = Array.getLength(a);
System.out.print(componentType.getName()+"["+length+"]={");
for(int i=0;i<Array.getLength(a);i++)
System.out.print(Array.get(a, i)+" ");
System.out.println("}");
}
注释:这段程序显示了通过反射,数组的工作过程。如果只希望扩大数组,利用Arrays类的copyOf方法就可以了。