如何在不创建新进程的情况下通过代码运行java命令?

如何在不创建新进程的情况下通过代码运行java命令?,java,Java,及 上述两种执行命令的方法创建了一个新的进程来运行该命令 有没有办法在同一进程中执行命令,而不创建新的进程 也许您可以使用ObjectInputStream将类读入流程中,正如@soong所评论的,您可以手动加载JAR和所需的类,然后通过反射调用main方法。您可以通过以下方式实现这一点: ProcessBuilder pb = new ProcessBuilder("java", "-server", "-jar", "yourJar.jar"); Process p = pb.start()

上述两种执行命令的方法创建了一个新的进程来运行该命令


有没有办法在同一进程中执行命令,而不创建新的进程

也许您可以使用ObjectInputStream将类读入流程中,

正如@soong所评论的,您可以手动加载JAR和所需的类,然后通过反射调用
main
方法。您可以通过以下方式实现这一点:

ProcessBuilder pb = new ProcessBuilder("java", "-server", "-jar", "yourJar.jar");
Process p = pb.start();
//将JAR文件作为文件实例加载
String myJarPath=“C:\\somefolder\\someOtherFolder\\MyJar.jar”;
File myJarFile=新文件(myJarPath);
//基于JAR的URL创建一个新的类加载器
URLClassLoader classLoader=新的URLClassLoader(新的URL[]{myJarFile.toURI().toURL()});
//用main方法加载类
Class classToLoad=classLoader.loadClass(“MyClass”);
//获取主方法
方法Method=classToLoad.getMethod(“main”,字符串[].class);
//调用它
字符串args[]={“arg1”,“arg2”};//要传递给main方法,它可以为null
调用(空,(对象)参数);//第一个参数为null,因为main是静态的

我不打算写一个完整的答案,但基本思想是:使用反射库手动加载类(查找类加载器),然后实例化所需的类,并调用其主方法。您的问题让我想起了“问题”手册页的序言。。。从Perl中使用Perl?阅读perlfunc中的“do”和“eval”,perlfunc中的“require”和perlfunc中的“Use”。从C中使用C?重新思考您的设计
ProcessBuilder pb = new ProcessBuilder("java", "-server", "-jar", "yourJar.jar");
Process p = pb.start();
// load your JAR file as a File instance
String myJarPath = "C:\\somefolder\\someOtherFolder\\MyJar.jar";
File myJarFile = new File(myJarPath);

// create a new class loader based on your JAR's URL
URLClassLoader classLoader = new URLClassLoader(new URL[]{myJarFile.toURI().toURL()});

// load the class with the main method
Class<?> classToLoad = classLoader.loadClass("MyClass");

// get the main method
Method method = classToLoad.getMethod("main", String[].class);

// invoke it
String args[] = {"arg1", "arg2"};   // args to pass to the main method, it can be null
method.invoke(null, (Object) args); // first parameter is null because main is static