JAVA 反射创建数组和操作数组的意义

来源:互联网 发布:淘宝店铺招牌添加链接 编辑:程序博客网 时间:2024/05/06 03:51
Java反射技术除了可以在运行时动态地决定要创建什么类型的对象,访问哪些成员变量,方法,还可以动态地创建各种不同类型,不同维度的数组。

动态创建数组的步骤如下:
1.创建Class对象,通过forName(String)方法指定数组元素的类型
2.调用Array.newInstance(Class, length_of_array)动态创建数组

访问动态数组元素的方法和通常有所不同,它的格式如下所示,注意该方法返回的是一个Object对象
Array.get(arrayObject, index)

为动态数组元素赋值的方法也和通常的不同,它的格式如下所示, 注意最后的一个参数必须是Object类型
Array.set(arrayObject, index, object)

动态数组Array不单可以创建一维数组,还可以创建多维数组。步骤如下:
1.定义一个整形数组:例如int[] dims= new int{5, 10, 15};指定一个三维数组
2.调用Array.newInstance(Class, dims);创建指定维数的数组

访问多维动态数组的方法和访问一维数组的方式没有什么大的不同,只不过要分多次来获取,每次取出的都是一个Object,直至最后一次,赋值也一样。

动态数组Array可以转化为普通的数组,例如:
Array arry = Array.newInstance(Integer.TYPE,5);
int arrayCast[] = (int[])array;

以下实例默认已经默认导入Array:import java.lang.reflect.Array;

【2】示例代码A. 一维数组:

public static void main(String args[]) throws Exception {Class<?> classType = Class.forName("java.lang.String");// 创建一个长度为10的字符串数组Object array = Array.newInstance(classType, 10);// 把索引位置为5的元素设为"hello"Array.set(array, 5, "hello");// 获得索引位置为5的元素的值String s = (String) Array.get(array, 5);System.out.println(s);}

B. 多维数组:

public static void main(String args[]) {int[] dims = new int[] { 5, 10, 15 };// 创建一个具有指定的组件类型和维度的新数组。Object array = Array.newInstance(Integer.TYPE, dims);// 取出三维数组的第3行,为一个数组Object arrayObj = Array.get(array, 3);Class<?> cls = arrayObj.getClass().getComponentType();System.out.println(cls);// 取出第3行的第5列,为一个数组arrayObj = Array.get(arrayObj, 5);// 访问第3行第5列的第10个元素,为其赋值37Array.setInt(arrayObj, 10, 37);// 动态数组和普通数组的转换:强行转换成对等的数组int arrayCast[][][] = (int[][][]) array;System.out.println(arrayCast[3][5][10]);}

JAVA 反射创建数组和操作数组的意义

数组是Java编程语言中的对象。与所有对象一样,它们都有类。如果您有一个数组,使用标准 getClass 方法,您可以获得该数组的类,就象任何其它对象一样。但是, 不通过现有的实例来获得类不同于其它类型的对象。即使您有一个数组类,您也不能直接对它进行太多的操作 -- 反射为标准类提供的构造函数接入不能用于数组,而且数组没有任何可接入的字段,只有基本的 java.lang.Object 方法定义用于数组对象。数组的特殊处理使用 java.lang.reflect.Array 类提供的静态方法的集合。该类中的方法使您能够创建新数组,获得数组对象的长度,读和写数组对象的索引值。

下面显示了一种重新调整现有数组大小的有效方法。它使用反射来创建相同类型的新数组,然后在返回新数组之前,在老数组中复制所有数据。

通过反射来扩展一个数组:

public Object growArray(Object array, int size) {    Class type = array.getClass().getComponentType();    Object grown = Array.newInstance(type, size);    System.arraycopy(array, 0, grown, 0,Math.min(Array.getLength(array), size));    return grown;}
原创粉丝点击