Java反射中,如果Method的参数里含有数组或者可变参数形式,那么在调用Invoke的时候,稍有点诡异,这里记录一下。可变参数实质就是数组,调用方式和普通数组一样。
先看一个简单的类
- public class Target {
- public void arrayInput(String[] inputs) {
- for (String each : inputs) {
- System.out.print(each);
- }
- System.out.println();
- }
- }
public class Target { public void arrayInput(String[] inputs) { for (String each : inputs) { System.out.print(each); } System.out.println(); } }
看如何反射调用含数组参数的方法
- import java.lang.reflect.Array;
- import java.lang.reflect.Method;
- public class ArrayReflection {
- public static void main(String[] args) {
- Class<Target> clazz = Target.class;
- try {
- Object object = clazz.newInstance();
- // 数组参数的调用方法
- Method arrayInputMethod = clazz.getMethod("arrayInput",
- String[].class);
- // 写法一,可以理解
- Object arrayObj = Array.newInstance(String.class, 2);
- Array.set(arrayObj, 0, "Hello");
- Array.set(arrayObj, 1, "World");
- arrayInputMethod.invoke(object, arrayObj);
- // 写法二,按照Eclipse提示写出来的,不理解
- String[] stringArray = new String[]{"Cafe","Baby"};
- arrayInputMethod.invoke(object, new Object[] { stringArray });
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
import java.lang.reflect.Array; import java.lang.reflect.Method; public class ArrayReflection { public static void main(String[] args) { Class<Target> clazz = Target.class; try { Object object = clazz.newInstance(); // 数组参数的调用方法 Method arrayInputMethod = clazz.getMethod("arrayInput", String[].class); // 写法一,可以理解 Object arrayObj = Array.newInstance(String.class, 2); Array.set(arrayObj, 0, "Hello"); Array.set(arrayObj, 1, "World"); arrayInputMethod.invoke(object, arrayObj); // 写法二,按照Eclipse提示写出来的,不理解 String[] stringArray = new String[]{"Cafe","Baby"}; arrayInputMethod.invoke(object, new Object[] { stringArray }); } catch (Exception e) { e.printStackTrace(); } } }
看输出:
如果这样写
- arrayInputMethod.invoke(object, new String[]{"wrong","style"});
arrayInputMethod.invoke(object, new String[]{"wrong","style"});
会报如下错误
java.lang.IllegalArgumentException: wrong number of arguments
此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/70352.html