简体   繁体   English

如何在java中使用反射调用类的main()方法

[英]How to call main() method of a class using reflection in java

When calling the main method of a Java class from another main method using reflection, 当使用反射从另一个main方法调用Java类的main方法时,

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

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

Should i create newInstance() or simply call main() as it is static. 我应该创建newInstance()还是简单地调用main(),因为它是静态的。

For your stated requirements (dynamically invoke the main method of a random class, with reflection you have alot of unnecessary code. 对于您声明的要求(动态调用随机类的主要方法,使用反射,您有很多不必要的代码。

  • You do not need to invoke a constructor for the class 您不需要为该类调用构造函数
  • You do not need to introspect the classes fields 您不需要内省类字段
  • Since you are invoking a static method, you do not even need a real object to invoke the method on 由于您正在调用静态方法,因此您甚至不需要真正的对象来调用该方法

You can adapt the following code to meet your needs: 您可以调整以下代码以满足您的需求:

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();
}

Perceptions answer looks correct; 认知答案看起来是正确的; if you need load from a Jar not in the class path you can use a URL class loader 如果您需要从不在类路径中的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();
      }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM