假设我有
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
变量,使其通过索引获得数组元素?
回答题目:
Java不给数组添加新的方法。数组中可用的方法只有继承自Object
类的方法,没有像array.get(index)
那样可以通过:
method.invoke(array,index)
这就是为什么反射包有实用程序类java.lang.reflect.Array
,它包含像public static Object get(Object array, int index)
这样的方法和像public static int getInt(Object array, int index)
这样的基本类型的重载版本。它还包含相应的set(array, index, value)
方法。
有了这些,我们可以编写像
这样的代码int[] array = new int[] {1, 2, 3};
int element2 = Array.getInt(array, 2);//reflective way
//or
//int element2 = (int) Array.get(array, 2);//reflective way
System.out.println(element2);
但如果你的问题的目标是解决谜题,我们需要填补空白,让下面的代码工作
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
那么可能拼图的作者希望你反射地调用Arrays.get(array,index)
。换句话说,method
应该代表
Method method = Array.class.getDeclaredMethod("get", Object.class, int.class);
但这也需要在Array.class
或null
上调用该方法(因为它是静态的),所以我们还需要修改
int element2 = (int) method.invoke(array, 2);
并添加为第一个参数
int element2 = (int) method.invoke(Array.class, array, 2); // reflection version
^^^^^^^^^^^
或
int element2 = (int) method.invoke(null, array, 2); // reflection version
^^^^
尝试使用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
得到数组