Java反射存取運算元組

2020-07-16 10:05:20
在 java.lang.reflect 包下提供了一個 Array 類,Array 物件可以代表所有的陣列。程式可以通過使用 Array 來動態地建立陣列,運算元組元素等。

Array 提供了如下幾類方法。
  • static Object newInstance(Class<?> componentType, int…length):建立一個具有指定的元素型別、指定維度的新陣列。
  • static xxx getXxx(Object array, int index):返回 array 陣列中第 index 個元素。其中 xxx 是各種基本資料型別,如果陣列元素是參照型別,則該方法變為 get(Object array, int index)。
  • static void setXxx(Object array, int index, xxx val):將 array 陣列中第 index 個元素的值設為 val。

其中 xxx 是各種基本資料型別,如果陣列元素是參照型別,則該方法變成 set(Object array, int index, Object val)。

下面程式示範了如何使用 Array 來生成陣列,為指定陣列元素賦值,並獲取指定陣列元素的方式。
public class ArrayTest1 {
    public static void main(String args[]) {
        try {
            // 建立一個元素型別為String,長度為10的陣列
            Object arr = Array.newInstance(String.class, 10);
            // 依次為arr陣列中index為5、6的元素賦值
            Array.set(arr, 5, "C語言中文網Java教學");
            Array.set(arr, 6, "C語言中文網C語言教學");
            // 依次取出arr陣列中index為5、6的元素的值
            Object course1 = Array.get(arr, 5);
            Object course2 = Array.get(arr, 6);
            // 輸出arr陣列中index為5、6的元素
            System.out.println(course1);
            System.out.println(course2);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}
上面程式中第 5、7 和 8 行程式碼分別是通過 Array 建立陣列,為陣列元素設定值,存取陣列元素的值的範例程式碼,程式通過使用 Array 就可以動態地建立並運算元組。

下面程式比上面程式稍微複雜一點,下面程式使用 Array 類建立了一個三維陣列。
public class ArrayTest2 {
    public static void main(String args[]) {
        /*
         * 建立一個三維陣列
         * 三維陣列也是一維陣列,是陣列元素是二維陣列的一維陣列,因此可以認為arr是長度為3的一維陣列
         */
        Object arr = Array.newInstance(String.class, 3, 4, 10);
        // 獲取arr陣列中index為2的元素,該元素應該是二維陣列
        Object arrObj = Array.get(arr, 2);
        // 使用Array為二維陣列的陣列元素賦值,二維陣列的陣列元素是一維陣列
        // 所以傳入Array的set()方法的第三個引數是一維陣列
        Array.set(arrObj, 2, new String[] { "C語言中文網Java教學", "C語言中文網C語言教學" });
        // 獲取arrObj陣列中index為3的元素,該元素應該是一維陣列
        Object anArr = Array.get(arrObj, 3);
        Array.set(anArr, 8, "C語言中文網Python教學");
        // 將arr強制型別轉換為三維陣列
        String[][][] cast = (String[][][]) arr;
        // 獲取cast三維陣列中指定元素的值
        System.out.println(cast[2][3][8]);
        System.out.println(cast[2][2][0]);
        System.out.println(cast[2][2][1]);
    }
}
上面程式的第 7 行程式碼使用 Array 建立了一個三維陣列,程式中較難理解的地方是第 12 行程式碼,使用 Array 為 arrObj 的指定元素賦值,相當於為二維陣列的元素賦值。由於二維陣列的元素是一維陣列,所以程式傳入的引數是一個一維陣列物件。

執行上面程式,結果如下:

C語言中文網Python教學
C語言中文網Java教學
C語言中文網C語言教學

從執行結果可以看到 cast[2][3][8]、cast[2][2][0]、cast[2][2][1] 元素都有值,這些值就是剛才程式通過反射傳入的陣列元素值。