java - GetMethod 并通过反射传递 Object[] 作为参数来调用它

标签 java

我有以下抛出异常的代码片段,问题似乎出在我试图传递给“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/

相关文章:

java - LinkedList越界异常

java - 递归函数 : Check for palindrome in Java

java - 如何在jSTL中使用正则表达式?

java - 我想获得 Push() 生成的唯一 ID

java - 更改溢出菜单的颜色

java - 我如何在java中迭代TwoDHashMap?

java - 同时拉入多个文件

java - 调试从 Tomcat (JSP) 运行的 Java 程序

Java递归添加到列表

java - 带有设置按钮的默认操作栏