5

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

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

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

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

4

2 回答 2

9

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

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

您可以调整以下代码以满足您的需求:

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();
}
于 2013-03-23T01:58:40.200 回答
1

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();
      }
于 2013-03-23T02:13:00.173 回答