如何获得/设置数组元素与反射



假设我有

 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.classnull上调用该方法(因为它是静态的),所以我们还需要修改
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
  • 得到数组

相关内容

  • 没有找到相关文章

最新更新