使用反射编写泛型数组代码
2017-01-10 14:39
274 查看
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方法就可以了。
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方法就可以了。
相关文章推荐
- 【Core Java Volume 3】反射---编写泛型数组代码
- java反射编写泛型数组代码
- Java--(三)反射之编写泛型数组代码
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- 编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合
- 编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现
- Java下的Framework编写(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)(1)--序
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议98~101)
- 编写高质量代码:改善Java的151个建议八(泛型和反射)93
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
- 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现
- 利用Java反射、泛型和apache/poi编写可通用的导出Excel代码
- (附代码)根据输入信息构建不同人种类,统一打印不同国家地区的身高、体重信息(泛型数组应用,多态、重载、泛型、反射等概念体验)
- 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组
- 编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值
- 编写高质量代码改善C#程序的157个建议——建议42:使用泛型参数兼容泛型接口的不可变性
- 对象数组 存储打印 代码 及泛型使用
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议102~105)
- 编写高质量代码改善C#程序――使用泛型集合代替非泛型集合(建议20)