java - 如何从不同的 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
解决方案
实现插件架构的正确方法是使用ServiceLoader类。但是您的情况似乎要简单得多,因为您的Test
类只有一个静态方法。
首先,main
类的方法Test
是static
。这意味着无需创建实例即可调用它,因此您应该删除对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
方法,不需要特定的实例。
推荐阅读
- data-binding - 当值为“”Angular 6时从对象中删除一个属性
- r - 如何在有条件的情况下使用 expand.grid?
- google-cloud-functions - Firebase 图片调整大小扩展的问题
- c# - 如何使用 for each 将多个对象添加到数据库中
- reactjs - 通过事件处理程序将组件添加到渲染树,该组件似乎没有收到新的道具。为什么是这样?
- c# - 将数据绑定到 Datagridview 的特定列 - 实体框架
- firebase - Flutter with firebase 试图在与我的登录屏幕不同的屏幕或小部件上访问当前用户
- c++ - 尝试使用 gcc 构建 pybind11 项目时获取未定义的引用
- r - 使用 R 基于时间序列中的其他变量创建新变量
- javascript - OnEdit 和最后一行