我有以下抛出异常的代码片段,问题似乎出在我试图传递给“foo”方法的参数上。
public void test() {
try {
Class<?>[] paramType = new Class[] { Object[].class };
Method m = this.getClass().getMethod("foo", paramType);
Object tt = (Object)new String("TEST");
m.invoke(this, new Object[] { tt });
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void foo(Object[] params) {
System.out.println("ffffoooooo" + params);
}
异常(exception):
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at reflection.MyReflection.invokeMethod(MyReflection.java:50)
at reflection.MyReflection.main(MyReflection.java:20)
有人能发现我的错误吗?
最佳答案
Method.invoke
方法采用一个 Object[]
参数,该参数对应于您要提供的参数。
由于您有一个 Object[]
类型的参数,因此您需要将其包装在另一个 Object[]
中。例如:
m.invoke(this, new Object[] { new Object[] { tt } });
或者您可以使用它是 invoke
上的 varargs 参数这一事实:
Object argument = new Object[] { tt };
m.invoke(this, argument);
请注意,argument
的编译时类型为 Object
而不是 Object[]
在这里很重要,以便使编译器由于可变参数创建数组。如果您将 argument
声明为 Object[]
类型,编译器不会将其包装在另一个数组中。
关于java - GetMethod 并通过反射传递 Object[] 作为参数来调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29372052/