如何使用反射获取/设置数组元素?

时间:2014-05-06 16:35:36

标签: java arrays reflection

假设我有

 int[] array = new int[] {1, 2, 3};
 Method method = // something

 // int element2 = array[2]; // non-reflection version 
 int element2 = (int) method.invoke(array, 2); // reflection version

如何填充method变量以使其按索引获取数组元素?

2 个答案:

答案 0 :(得分:2)

作为类型的数组不添加任何方法,因此您可以在array实例上调用的唯一方法是来自Object类的方法。所以调用

method.invoke(array,index)

on array不能从数组返回元素,因为数组不提供这样的方法。

这就是在反射包中添加java.lang.reflect.Array类的原因,因此您可以调用静态方法get(array,index)

int[] array = new int[] {1, 2, 3};
int element2 = (int) Array.get(array, 2);//reflective way
System.out.println(element2);

如果您坚持使用method.invoke,则可以尝试使用

Method method = Array.class.getDeclaredMethod("get", Object.class, int.class);
int element2 = (int) method.invoke(Array.class, array, 2); // reflection version
                                   ^^^^^^^^^^^

但是这样你需要在invoke方法参数的开头传递额外的参数,这些参数将代表调用此方法的类。由于此方法是静态的,因此您也可以将null作为第一个参数传递

int element2 = (int) method.invoke(null, array, 2); // reflection version
                                   ^^^^

答案 1 :(得分:0)

尝试使用List

int[] array = new int[] { 1, 2, 3 };

// create a List and populate
List<Integer> list = new ArrayList<Integer>();
for (int i : array) {
    list.add(i);
}

// use reflection method get/set on List
Method method = List.class.getDeclaredMethod("get", new Class[] { Integer.TYPE });
Object element2 = method.invoke(list, 2); // reflection version

System.out.println(element2); // output 3
  • 数组没有任何get方法。您可以尝试使用List
  • 最后,您可以从List
  • 返回数组