Java 反射reflect.Array类
reflect.Array类位于java.lang.reflect包下,它是个反射工具包,全是静态方法,创建数组以多维数组为基准,一维数组只是特殊实现。
定义
public final class Array extends Object
它允许扩大转换在get或set操作发生,如果缩小转换会抛出IllegalArgumentException。
例子
1. 通过反射操作数组
public class Demo { public static void main(String[] args) throws Exception { int[] arr = {1,2,3,4,5}; Class<?> c = arr.getClass().getComponentType(); System.out.println("数组类型: " + c.getName()); int len = Array.getLength(arr); System.out.println("数组长度: " + len); System.out.print("遍历数组: "); for (int i = 0; i < len; i++) { System.out.print(Array.get(arr, i) + " "); } System.out.println(); //修改数组 System.out.println("修改前的第一个元素: " + Array.get(arr, 0)); Array.set(arr, 0, 3); System.out.println("修改后的第一个元素: " + Array.get(arr, 0)); } }
执行结果:

2. 多维数组的程序实例
public static void main(String[] args) { int[] dims = new int[] { 5, 10, 15 }; // 注意区分下面两种 System.out.println(Integer.TYPE); // int System.out.println(Integer.class); // Integer // 创建一个三维数组,这个数组的三个维度分别是5,10,15 Object array = Array.newInstance(Integer.TYPE, dims); // 可变参数,也可以这样写: // Object array = Array.newInstance(Integer.TYPE, 5,10,15); System.out.println(array instanceof int[][][]); Class < ?>classType0 = array.getClass().getComponentType(); // 返回数组元素类型 System.out.println(classType0); // 三维数组的元素为二维数组,输出:class [[I // 获得第一层的索引为3的数组,返回的是一个二维数组 Object arrayObject = Array.get(array, 3); Class < ?>classType = arrayObject.getClass().getComponentType(); // 返回数组元素类型 System.out.println(classType); // 二维数组的元素为一维数组,输出:class [I // 此处返回的是一个一维数组 arrayObject = Array.get(arrayObject, 5); Class < ?>classType2 = arrayObject.getClass().getComponentType(); // 返回数组元素类型 System.out.println(classType2); // 一维数组的元素为int // 给一维数组下标为10的位置设置值为37 Array.setInt(arrayObject, 10, 37); int[][][] arrayCast = (int[][][]) array; System.out.println(arrayCast[3][5][10]); }
3. 动态创建和访问Java数组的方法
public class TestArray { /**main*/ public static void main(String[] args) throws Exception { TestArray testArray = new TestArray(); testArray.testOneObject(); testArray.testOne(); testArray.testTwo(); } /**放置数据 * @throws ClassNotFoundException **/ public void testOneObject() throws ClassNotFoundException { Object object = Array.newInstance(Object.class, 10); Array.set(object, 3, "99999"); System.out.println(Array.get(object, 3)); } /**一维素组*/ public void testOne() throws ClassNotFoundException { Class < ?>classType = Class.forName("java.lang.String"); Object object = Array.newInstance(classType, 10); //数组0,9 Array.set(object, 5, "123"); System.out.println(Array.get(object, 5)); System.out.println(Array.getLength(object)); } /**二维数组*/ public void testTwo() throws ClassNotFoundException { Class < ?>classType = Class.forName("java.lang.String"); Object object = Array.newInstance(classType, new int[] { 10, 10 }); //数组0,9 Array.set(Array.get(object, 5), 5, "123"); //[5][5] 为"123",先获取一维,在通过一维获取二维的数据 System.out.println(Array.get(Array.get(object, 5), 5)); } }
总结
1、使用reflect.Array可以提供反射来构建数组。
2、使用set指定一个数组中的值。
3、最多支持255维,可以使用二维数组的方式进行一层一层的进行解析和设置值。
4. 在不确定某个参数或对象是否是数组的时候,就可以使用发射机制,把该对象的Class对象传给Array.isArray(Class<?>) 方法进行判断。通过Class对象的 getComponentType() 方法可以进一步知道数组组件的具体类型,数组如果是多维的话可以递归调用Array.isArray;
5. Array.getLength(class)可以得到数组的大小;
6. 可以运行时利用反射机制来创建某种类型的数组,利用 java.lang.reflect.Array.newInstance()方法(有两种形式),同样在创建的时候也可以递归的调用该方法。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。