【问题标题】:How to call main() method of a class using reflection in java如何在java中使用反射调用类的main()方法
【发布时间】:2013-03-23 01:45:07
【问题描述】:

当使用反射从另一个主方法调用 Java 类的主方法时,

Class thisClass = loader.loadClass(packClassName);
Method thisMethod = thisClass.getDeclaredMethod("main",String[].class);

thisMethod.invoke(null, new String[0]);

我应该创建 newInstance() 还是简单地调用 main(),因为它是静态的。

【问题讨论】:

  • 是否有构造函数采用参数类型String[]?
  • main 方法是静态的吗?如果是这样,为什么要创建该类的实例?如果不是,那么对invoke 的调用是错误的。
  • 实际上,当我调用非参数化方法时它可以正常工作,但在参数化方法中它不能正常工作......为什么会这样?
  • @RedSoxFan yah... 我想调用 main 方法及其参数为 String... s 或 String[] s
  • 现在我明白了,java.lang.IllegalArgumentException:sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的参数类型不匹配

标签: java reflection


【解决方案1】:

对于您声明的要求(动态调用随机类的 main 方法,通过反射,您有很多不必要的代码。

  • 您不需要为类调用构造函数
  • 您不需要自省类字段
  • 由于您调用的是静态方法,因此您甚至不需要真正的对象来调用该方法

您可以修改以下代码以满足您的需求:

try {
    final Class<?> clazz = Class.forName("blue.RandomClass");
    final Method method = clazz.getMethod("main", String[].class);

    final Object[] args = new Object[1];
    args[0] = new String[] { "1", "2"};
    method.invoke(null, args);
} catch (final Exception e) {
    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    Perceptions 的答案看起来是正确的;如果您需要从不在类路径中的 Jar 加载,您可以使用 URL 类加载器

         try {
            URL[] urls;
            URLClassLoader urlLoader;
    
            urls = ...;
    
            urlLoader = new URLClassLoader(urls);
    
            @SuppressWarnings("rawtypes")
            Class runClass = urlLoader.loadClass(classToRun);
    
            Object[] arguments = new Object[]{args};
            Method mainMethod = runClass.getMethod("main", String[].class);
            mainMethod.invoke(null, arguments);
          } catch (Exception e) {
            e.printStackTrace();
          }
    

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2014-03-26
      • 2011-06-21
      相关资源
      最近更新 更多