使用Java反射设置数组值时,“Argument不是数组”异常

时间:2013-07-14 20:53:21

标签: java arrays reflection

我需要根据输入数组tableParameter的值在运行时创建一个数组。

我的代码示例如下:

int[] tableParameter = new int[dimension + 1];
tableParameter[0] = N;
for(int i = 1; i < tableParameter.length; i++)
    tableParameter[i] = i;
Object myArray = Array.newInstance(int.class, tableParameter);
//set the index 1 of the array with the value 100
Array.setInt(myArray, 1, 100);

异常发生在上面代码的最后一行:

Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array

但是当我使用

System.out.println(myArray.getClass().getCanonicalName());

验证myArray的类,它打印出int [] [] [] [],这意味着myArray绝对是一个数组类型。

那么为什么JVM会抛出myArray不是数组的异常?

1 个答案:

答案 0 :(得分:3)

这可能是一个误导性的例外,但抱怨肯定是正确的。如果数组是int[][][][],则将索引1处的元素设置为值100是没有意义的。例如,这将无法编译:

int[][][][] array = new int[1][1][1][1];
array[0] = 100; // Nope...

如果元素是实际int,则只能将元素设置为int[]。因此,如果dimension为0(意味着您最终得到一维数组),并且如果N为2或更多,则代码可以正常工作。要从创建部分中反射出来:

import java.lang.reflect.Array;

class Test {
    public static void main(String[] args) throws Exception {
        int[] array1 = new int[10];
        Array.setInt(array1, 1, 100); // Works fine

        int[][] array2 = new int[10][10];
        Array.setInt(array2, 1, 100); // Throws IllegalArgumentException
    }
}