当前位置: 首页 > 知识库问答 >
问题:

无法使用反射调用main方法-IllegalArgumentException:参数类型不匹配

曹理
2023-03-14

我正在编写一个学习反射的示例应用程序。我试图使用反射从另一个类调用一个类中定义的主方法,但我得到了

线程“main”java中出现异常。lang.IllegalArgumentException:参数类型不匹配

在下面查找我正在尝试执行的代码。

调用main方法的类

import java.lang.reflect.Method;
public class Invoker {


public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("com.nagpal.invokemainmethod.Invoked");

    Method method = clazz.getMethod("main", new Class[] { String[].class });

    Object[] params = new Object[4];

    params[0] = "arg 1";
    params[1] = "arg 2";
    params[2] = "arg 3";
    params[3] = "arg 4";

    method.invoke(null, new Object[] { params });
}

要调用其主方法的类

public class Invoked {


public static void main(String[] args) {
    if (args.length < 3) {
        throw new IllegalArgumentException();
    }

    for (int i = 0; i < args.length; i++) {
        System.out.println("args[" + args[i] + "]");
    }
  }

  }

共有2个答案

锺英彦
2023-03-14

方法签名是字符串[],但参数的运行时类型是对象[]。尝试:

Object[] params = new String[4]
邢和光
2023-03-14

你快到了:params的类型应该是String[],而不是Object[]

String[] params = new String[4];

params[0] = "arg 1";
params[1] = "arg 2";
params[2] = "arg 3";
params[3] = "arg 4";

试图将对象[]传递到主(字符串[])会导致您看到的错误。

 类似资料:
  • 我试图通过对通过其JNDI引用查找的EJB的反射来调用一个方法。它需要三个参数:EndUser对象(自定义对象)、Set(自定义类)和布尔值。第一个对象使用“无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配”导致调用失败。只要第一个参数非空,就会发生这种情况。将其设置为空会使错误消失。 实际通话: EjbUtils方法: 我尝试调用的方法: 奇怪的

  • 问题内容: 我需要使用反射从另一个主要方法调用Java类的主要方法。 必须使用反射,以消除被调用主类的编译时依赖性。直截了当的方法并没有产生效果,因为它只识别“公共”和“非静态”方法。有什么建议吗? 问题答案: 不应比调用任何其他函数更复杂: 但是我真的看不到有什么用途,只要您不使用特定的代码路径,就可以买到该程序,而无需链接另一个程序,这是它唯一能为您带来的好处,但是如果这是您需要的,在这里走

  • 问题内容: 当使用反射从另一个主要方法调用Java类的主要方法时, 我应该创建newInstance()还是直接调用main(),因为它是静态的。 问题答案: 对于您陈述的要求(动态地调用随机类的main方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求:

  • 虽然知道使用反射不是一种好的测试方法,但我正在尝试测试我的代码。我有一个外部类作为public,有一个私有的内部类和一个公共方法,如下所示, 我的主要java类如下所示 这是投掷 线程“main”java中出现异常。lang.NoSuchMethodException:汽车。外部$内部。java上的test()。lang.Class。car上的getDeclaredMethod(Class.jav

  • 我目前试图通过反射执行一个方法,但方法参数只是一个列表。 该方法如下所示: 但Java对待他们就像 问题是参数的长度不同,该方法可以有任意数量的参数。 有没有办法解决这个问题?

  • 问题内容: 运行以下代码: 我得到了错误: 为什么是这样? 问题答案: 构造函数类的newInstance()方法采用一个对象数组。数组中的每个项目都是您要调用的构造函数的参数。您的类的构造函数需要一个对象数组,因此您需要在传递给新实例方法的数组内有一个对象数组