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

时间:2015-09-23 05:38:17

标签: java processbuilder

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

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();
    }
}

这里Test类没有执行但是如果我删除那两个参数那么只有它可以工作。 somene请告诉我如何传递对象作为参数?

3 个答案:

答案 0 :(得分:1)

当您启动新流程时,它不会与父流程共享任何数据。这与从命令行调用子进程相同。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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