【问题标题】:Java call main() method of a class using reflectionJava使用反射调用类的main()方法
【发布时间】:2011-06-26 04:33:36
【问题描述】:

我需要使用反射从另一个主方法调用 Java 类的主方法。

必须使用反射来消除被调用的主类的编译时依赖性。 直截了当的方法不会产生效果,因为它只识别“公共”和“非静态”方法。 有什么建议吗?

【问题讨论】:

  • 通过反射调用静态方法不应该比调用非静态方法更复杂。您能否发布您的代码,以便我们知道出了什么问题?
  • 请展示你到目前为止所做的尝试。

标签: java reflection


【解决方案1】:

不应该比调用任何其他函数更复杂:

public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    Class<?> cls = Class.forName("pkg1.pkg2.classname");
    Method meth = cls.getMethod("main", String[].class);
    String[] params = null; // init params accordingly
    meth.invoke(null, (Object) params); // static method doesn't have an instance
}

但我并没有真正看到它有很多用途,它唯一给你带来的好处是,只要你从不使用特定的代码路径,你就可以编译程序而无需链接另一个程序,但如果这是你需要的, 我们开始;)

【讨论】:

  • Thks...fr 你的时间和答案。我通过属性文件读取类的名称弄乱了代码,并且在传递参数时出错。一旦我纠正了它们,我确实可以打电话....
  • 在调用为什么我们需要将参数类型转换为 Object 的方法时,当 main 方法需要 String[] 并且我们传递完全相同的类型时。我尝试不进行类型转换,但它不起作用。知道为什么我们需要这样做。
  • @Bagira invoke 期望包含方法的所有参数的Object[]Object... 只是语法)。我们只想将一个参数传递给它一个字符串数组。问题是java中的数组是协变的(即String[] p; Object[] o = p将毫无问题地编译),因此如果我们只传递一个被解释为对象数组的单个字符串数组,那么该方法认为你传递了几个字符串而不是一个字符串数组。
  • 对每个人的重要提示:在这个答案中要注意的关键是对象的参数转换!这是必不可少的!请参阅上面的评论。
  • 上述方法几乎奏效了。分配给 params 的值不能为“null”。 (Main() 有权测试 args 数组的长度。)分配的值必须是 'new String[0]'。
【解决方案2】:
Method mainMethod = clazz.getDeclaredMethod("main", String[].class);
final Object[] args = new Object[1];
args[0] = new String[]{"1", "2"};
mainMethod.invoke(null, args);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多