在 ProcessBuilder 中将对象作为参数传递?

Pass object as parameter in ProcessBuilder?

我想将两个或多个对象作为参数传递给 ProcessBuilder,以便 运行 程序作为单独的进程。我尝试了以下代码,但它不起作用。

public static int exec(FTP ftp, Stage stage) throws IOException,
                                               InterruptedException {
        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome +
                File.separator + "bin" +
                File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        String className = Test.class.getCanonicalName();

        ProcessBuilder builder = new ProcessBuilder(
                javaBin, "-cp", classpath, className+" "+ftp+" "+stage);

        Process process = builder.start();
        process.waitFor();
        return process.exitValue();
    }

这是 Test.class

public class Test extends Application
{
    String lol = "000";
    public Test(FTP ftp, Stage stage)
    {
        // The logic goes here for those passed parameter
        System.out.println("This is Test");
    }

    @Override
    public void start(Stage arg0) throws Exception 
    {
        // TODO Auto-generated method stub
        arg0.setTitle("Hello there");
        arg0.setWidth(200);
        arg0.setHeight(200);

        arg0.setScene(new Scene(new Pane(new Label(lol)),1000,1000));
        arg0.show();
    }
}

此处测试 class 未执行,但如果我删除这两个参数,则只有它有效。有人可以告诉我如何将对象作为参数传递吗?

当您启动一个新进程时,它不会与父进程共享任何 数据。这与从命令行调用子进程是一样的。

您可以向子进程提供的唯一信息是被该进程接受(理解)为调用参数的信息并且它们必须作为字符串提供。子进程需要对调用参数进行解释,并通过解析创建需要的对象。

在您的情况下 - 您需要提供有关 ftpstage 的所有重要信息,以便新进程可以重新创建实例。即使那样,这些也将是新进程拥有的全新对象,独立于父进程的对象。

不,您不能跨进程边界传递实例对象(嗯,好吧,有共享内存,但您不能在 Java 中使用它,而且在 C 中通常不是正确的解决方案任何一个)。您可以做的是在进程之间传递 消息 。命令行参数是一种方式,但正如您所发现的那样,它们仅限于可以序列化为字符串的数据。

另一种选择是序列化您的对象并在子进程中反序列化它们。例如,您可以打开一个从父项到子项的 stdinObjectOutputStream,并通过它发送任意复杂的对象。但是,您在另一端获得的对象仍然是副本,与父进程中的对象的对象标识不同。

ProcessBuilder 只能在您想要 运行 一个 java 程序作为单独的进程时帮助您。无法将对象参数传递到 ProcessBuilder。两个不同进程之间不能直接传递参数。为此,您可以将这些对象存储到文件中,或者可以通过管道传递对象。