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原创文章,未经本站允许不得转载。