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变量以便它通过索引获取数组元素?
Java 不会向数组添加新方法。只有从数组中可用的方法是从类继承的方法Object,并且没有类似的方法array.get(index)可以通过以下方式使用:
method.invoke(array,index)\nRun 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)方法。
有了这些我们可以编写类似的代码
\nint[] 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);\nRun Code Online (Sandbox Code Playgroud)\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\nRun Code Online (Sandbox Code Playgroud)\n那么谜题的作者可能希望你反思地打电话Arrays.get(array,index)。换句话说method应该代表
Method method = Array.class.getDeclaredMethod("get", Object.class, int.class);\nRun Code Online (Sandbox Code Playgroud)\n但这也需要调用该方法 onArray.class或 on null(因为它是静态的),所以我们还需要修改
int element2 = (int) method.invoke(array, 2);\nRun Code Online (Sandbox Code Playgroud)\n并添加为第一个参数
\nint element2 = (int) method.invoke(Array.class, array, 2); // reflection version\n ^^^^^^^^^^^\nRun Code Online (Sandbox Code Playgroud)\n或者
\nint element2 = (int) method.invoke(null, array, 2); // reflection version\n ^^^^\nRun Code Online (Sandbox Code Playgroud)\n