如何通过反射获取/设置数组元素?

Suz*_*ioc 1 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
Run Code Online (Sandbox Code Playgroud)

如何填充method变量以便它通过索引获取数组元素?

Psh*_*emo 5

回答标题中的问题:

\n

Java 不会向数组添加新方法。只有从数组中可用的方法是从类继承的方法Object,并且没有类似的方法array.get(index)可以通过以下方式使用:

\n
method.invoke(array,index)\n
Run Code Online (Sandbox Code Playgroud)\n

这就是为什么反射包有实用程序类java.lang.reflect.Array,其中包含诸如 之类的方法public static Object get\xe2\x80\x8b(Object array, int index)以及诸如 之类的基本类型的重载版本public static int getInt\xe2\x80\x8b(Object array, int index)。它还包含相应的set(array, index, value)方法。

\n

有了这些我们可以编写类似的代码

\n
int[] array = new int[] {1, 2, 3};\nint element2 = Array.getInt(array, 2);//reflective way\n//or \n//int element2 = (int) Array.get(array, 2);//reflective way\nSystem.out.println(element2);\n
Run Code Online (Sandbox Code Playgroud)\n
\n

但是,如果您的问题的目标是解决难题,我们需要填补空白并让下面的代码起作用

\n
 int[] array = new int[] {1, 2, 3};\n Method method = ...................// something\n\n // int element2 = array[2]; // non-reflection version \n int element2 = (int) method.invoke(array, 2); // reflection version\n
Run Code Online (Sandbox Code Playgroud)\n

那么谜题的作者可能希望你反思地打电话Arrays.get(array,index)。换句话说method应该代表

\n
Method method = Array.class.getDeclaredMethod("get", Object.class, int.class);\n
Run Code Online (Sandbox Code Playgroud)\n

但这也需要调用该方法 onArray.class或 on null(因为它是静态的),所以我们还需要修改

\n
int element2 = (int) method.invoke(array, 2);\n
Run Code Online (Sandbox Code Playgroud)\n

并添加为第一个参数

\n
int element2 = (int) method.invoke(Array.class, array, 2); // reflection version\n                                   ^^^^^^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
int element2 = (int) method.invoke(null, array, 2); // reflection version\n                                   ^^^^\n
Run Code Online (Sandbox Code Playgroud)\n