Java 如何获取/设置具有反射的数组元素?

Java 如何获取/设置具有反射的数组元素?,java,arrays,reflection,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 如何填充方法变量,使其按索引获取数组元素?回答标题中的问题: Java不会向数组添加新方法。数组中唯一可

如果我有

 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
如何填充
方法
变量,使其按索引获取数组元素?

回答标题中的问题: Java不会向数组添加新方法。数组中唯一可用的方法是从
对象
类继承的方法,没有类似于
array.get(index)
的方法,我们可以通过以下方式使用它们:

method.invoke(array,index)
这就是反射包具有实用程序类的原因,该类包含类似的方法以及类似的基元类型的重载版本。它还包含相应的
集合(数组、索引、值)
方法

有了这些,我们可以像这样编写代码

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);

但是,如果你的问题的目标是解决难题,我们需要填补空白,让下面的代码工作 然后,拼图的作者可能希望您反射性地调用
array.get(array,index)
。换句话说,
方法
应该代表

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
                                   ^^^^^^^^^^^

回答标题中的问题: Java不会向数组添加新方法。数组中唯一可用的方法是从
对象
类继承的方法,没有类似于
array.get(index)
的方法,我们可以通过以下方式使用它们:

method.invoke(array,index)
这就是反射包具有实用程序类的原因,该类包含类似的方法以及类似的基元类型的重载版本。它还包含相应的
集合(数组、索引、值)
方法

有了这些,我们可以像这样编写代码

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);

但是,如果你的问题的目标是解决难题,我们需要填补空白,让下面的代码工作 然后,拼图的作者可能希望您反射性地调用
array.get(array,index)
。换句话说,
方法
应该代表

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[] 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
int[]数组=新的int[]{1,2,3};
//创建一个列表并填充
列表=新的ArrayList();
for(int i:array){
列表.添加(i);
}
//使用反射方法获取/设置列表
Method=List.class.getDeclaredMethod(“get”,新类[]{Integer.TYPE});
Object element2=方法.调用(列表,2);//反射版本
System.out.println(元素2);//产出3
  • 数组没有任何
    get
    方法。您可以尝试使用
    列表
  • 最后,您可以从
    列表

尝试使用
列表

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
int[]数组=新的int[]{1,2,3};
//创建一个列表并填充
列表=新的ArrayList();
for(int i:array){
列表.添加(i);
}
//使用反射方法获取/设置列表
Method=List.class.getDeclaredMethod(“get”,新类[]{Integer.TYPE});
Object element2=方法.调用(列表,2);//反射版本
System.out.println(元素2);//产出3
  • 数组没有任何
    get
    方法。您可以尝试使用
    列表
  • 最后,您可以从
    列表

请查看我的更新。我希望
Method
返回数组的元素您不能有一个将数组作为第一个参数的自定义方法。您可以使用MethodHandles和闭包,但不能使用普通方法。您可以执行
method.invoke(null,array,2)改为。请查看我的更新。我希望
Method
返回数组的元素您不能有一个将数组作为第一个参数的自定义方法。您可以使用MethodHandles和闭包,但不能使用普通方法。您可以执行
method.invoke(null,array,2)
相反。但是OP正在查找或
方法.invoke()
否则这也是一个答案
数组[2]
这不是
方法
,而
get
是静态的。所以,没有(非静态)方法可以获取数组的元素?但OP正在查找或
method.invoke()
,否则这也是一个答案
array[2]
这不是
method
,而
get
是静态的。所以,没有(非静态)方法可以获得数组的元素?