首页 > 解决方案 > 如何从不同的 Java 代码执行 Runnable JAR 的主要方法?

问题描述

我有一个test.jar. 这jar只有一个类。它所做的只是删除一个文件夹

import java.io.File;
public class Test {
    public static void main(String[] args) {
        File fileTest = new File("C:\\Users\\...\\test"); 
        fileTest.delete();          
    }
}

我需要test.jar从其他 java 应用程序外部执行这个

这是我尝试过的

  ClassLoader pluginLoader = new PluginClassLoader(new URL("file:\\\\C:\\Users\\ . . .\\test.jar"));
  Class<?> pluginClass = pluginLoader.loadClass("Test");        
  Plugin plugin = (Plugin) pluginClass.newInstance();  
  pluginClass.getMethod("main"); // trying to get main method but it throw no such method exception 

标签: java

解决方案


实现插件架构的正确方法是使用ServiceLoader类。但是您的情况似乎要简单得多,因为您的Test类只有一个静态方法。

首先,main类的方法Teststatic。这意味着无需创建实例即可调用它,因此您应该删除对pluginClass.newInstance().

其次,Java 中的方法由其签名定义。 签名由方法名称和方法参数的类型标识。没有带签名main()的方法,但有带签名的方法main(String[])

您需要指定您请求的方法的完整签名:

pluginClass.getMethod("main", String[].class);

最后,您可以调用它:

Method main = pluginClass.getMethod("main", String[].class);
main.invoke(null, new Object[] { new String[0] });

的第一个参数main.invoke是 null,因为它是一个static方法,不需要特定的实例。


推荐阅读